File tree Expand file tree Collapse file tree 2 files changed +77
-0
lines changed
rozwiazania/xxvi/etap2/probne/roz Expand file tree Collapse file tree 2 files changed +77
-0
lines changed Original file line number Diff line number Diff line change 1+ // Rozwiązanie do zadania 'Rozliczenia' z II etapu XXVI OI.
2+ // Autor rozwiązania: Paweł Putra
3+ // Złożoność czasowa: O(m * log(m))
4+ // Złożoność pamięciowa: O(m), ze stałą 1.
5+ // Punkty: 100 (upsolve)
6+
7+ struct Fenwick {
8+ int n;
9+ long long fw[1000005 ];
10+
11+ void add (int x, long long delta) {
12+ for (;x < n; x |= x + 1 )
13+ fw[x] += delta;
14+ }
15+
16+ long long sum (int r) {
17+ long long res = 0 ;
18+ for (; r >= 0 ; r = (r & (r+1 )) - 1 )
19+ res += fw[r];
20+ return res;
21+ }
22+
23+ long long sum (int l, int r) {
24+ return sum (r) - sum (l-1 );
25+ }
26+ } fw;
27+
28+ struct Deque {
29+ int n, first, last;
30+ Deque () {}
31+ Deque (int n) : n(n), first(0 ), last(0 ) {}
32+ void push_back (long long x) {
33+ last = (last + 1 ) % n;
34+ if (last == first) {
35+ // Trzeba nadpisać to co było w miejscu pierwszego.
36+ x -= fw.sum (first, first);
37+ first = (first + 1 ) % n;
38+ }
39+
40+ fw.add (last, x);
41+ }
42+
43+ void set (int i, int k) {
44+ i = (last - i + 1 + n) % n;
45+ fw.add (i, k);
46+ }
47+
48+ long long sum (int i) {
49+ int r = last;
50+ int l = (last - i + 1 + n) % n;
51+ if (l <= r) {
52+ return fw.sum (l, r);
53+ } else {
54+ return fw.sum (0 , r) + fw.sum (l, n-1 );
55+ }
56+ }
57+ };
58+
59+ Deque dq;
60+ void inicjuj (int m) {
61+ dq = Deque (m);
62+ fw.n = m;
63+ for (int i = 0 ; i < m; i++) fw.fw [i] = 0 ;
64+ }
65+
66+ void dodaj (int k) {
67+ dq.push_back (k);
68+ }
69+
70+ void koryguj (int i, int k) {
71+ dq.set (i, k);
72+ }
73+
74+ long long suma (int i) {
75+ return dq.sum (i);
76+ }
77+
File renamed without changes.
You can’t perform that action at this time.
0 commit comments