-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy path2042.cpp
43 lines (37 loc) · 912 Bytes
/
2042.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
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int n, m, k, gae;
long long arr[4040404];
long long sum(int l, int r, int num, int nl, int nr) {
if (r < nl || nr < l) return 0;
if (l <= nl && nr <= r) return arr[num];
int mid = (nl + nr) / 2;
return sum(l, r, num*2, nl, mid) + sum(l, r, num*2+1, mid+1, nr);
}
void update(int i, long long val) {
i += gae/2;
arr[i] = val;
while (i > 1) {
i /= 2;
arr[i] = arr[i*2] + arr[i*2 + 1];
}
}
int main(int argc, char **argv)
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m >> k;
gae = 1<<(int)ceil(log2(n) + 1);
for (int i = gae/2; i < gae/2+n; ++i) cin >> arr[i];
for (int i = gae/2-1; i > 0; --i) arr[i] = arr[i*2] + arr[i*2 + 1];
int t = m + k;
while (t--) {
long long a, b, c;
cin >> a >> b >> c;
if (a == 1) update(b-1, c);
else cout << sum(b-1, c-1, 1, 0, gae/2-1) << '\n';
}
}