-
Notifications
You must be signed in to change notification settings - Fork 35
/
Copy pathB.cpp
98 lines (76 loc) · 2.04 KB
/
B.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include <iostream>
using namespace std;
int getMiddle(int l, int r) {
return l + (r - l) / 2;
}
void updating(long long* st, int tl, int tr, int i, long long diff, int ind) {
if (i < tl || i > tr) {
return;
}
st[ind] = st[ind] + diff;
if (tr != tl) {
int mid = getMiddle(tl, tr);
updating(st, tl, mid, i, diff, 2 * ind + 1);
updating(st, mid + 1, tr, i, diff, 2 * ind + 2);
}
}
void update(long long* a, long long* st, int n, int i, long long new_Value) {
long long diff = new_Value - a[i];
a[i] = new_Value;
updating(st, 0, n - 1, i, diff, 0);
}
long long buildTree(long long* a, int tl, int tr, long long* st, int ind) {
if (tl == tr) {
st[ind] = a[tl];
return a[tl];
}
int mid = getMiddle(tl, tr);
st[ind] = buildTree(a, tl, mid, st, ind * 2 + 1) + buildTree(a, mid + 1, tr, st, ind * 2 + 2);
return st[ind];
}
long long sum(long long* st, int tl, int tr, int l, int r, int ind) {
if (l <= tl && r >= tr) {
return st[ind];
}
if (tr < l || tl > r) {
return 0;
}
int mid = getMiddle(tl, tr);
return sum(st, tl, mid, l, r, 2 * ind + 1) + sum(st, mid + 1, tr, l, r, 2 * ind + 2);
}
long long* buildingTree(long long* a, int n) {
long long* st = new long long[4 * n];
buildTree(a, 0, n - 1, st, 0);
return st;
}
long long get(long long* st, int n, int l, int r) {
return sum(st, 0, n - 1, l, r, 0);
}
int main() {
freopen("rsq.in", "r", stdin);
freopen("rsq.out", "w", stdout);
int n;
cin >> n;
long long a[n];
for (int i = 0; i < n; i++) {
cin >> a[i];
}
long long* st = buildingTree(a, n);
string s;
while (cin >> s) {
if (s == "sum") {
int i, j;
cin >> i;
cin >> j;
cout << get(st, n, i - 1, j - 1) << "\n";
}
if (s == "set") {
int i;
long long x;
cin >> i;
cin >> x;
update(a, st, n, i - 1, x);
}
}
return 0;
}