-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathSegTree.cpp
More file actions
87 lines (84 loc) · 1.56 KB
/
SegTree.cpp
File metadata and controls
87 lines (84 loc) · 1.56 KB
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
#include <bits/stdc++.h>
using namespace std;
#define PI acos(-1)
#define pb push_back
#define int long long int
#define mp make_pair
#define pi pair<int, int>
#define pii pair<pi, int>
#define fir first
#define sec second
#define MAXN 100001
#define MAXL 100
#define mod 1000000007
vector<int> seg;
vector<int> v;
int single(int x)
{
return x;
}
int neutral()
{
return 0;
}
int merge(int a, int b)
{
return a + b;
}
void update(int i, int l, int r, int q, int x)
{
if (l == r)
{
seg[i] = single(x);
return;
}
int mid = (l + r) >> 1;
if (q <= mid)
update(i << 1, l, mid, q, x);
else
update((i << 1) | 1, mid + 1, r, q, x);
seg[i] = merge(seg[i << 1], seg[(i << 1) | 1]);
}
int query(int l, int r, int ql, int qr, int i)
{
int mid = (l + r) >> 1;
if (l > r || l > qr || r < ql)
return neutral();
if (l >= ql && r <= qr)
return seg[i];
return merge(query(l, mid, ql, qr, i << 1), query(mid + 1, r, ql, qr, (i << 1) | 1));
}
void build(int l, int r, int i)
{
if (l == r)
{
seg[i] = single(v[l]);
return;
}
int mid = (l + r) >> 1;
build(l, mid, i << 1);
build(mid + 1, r, (i << 1) | 1);
seg[i] = merge(seg[i << 1], seg[(i << 1) | 1]);
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, q;
cin >> n >> q;
v.resize(n);
seg.resize(4 * n);
for (int i = 0; i < n; i++)
cin >> v[i];
build(0, n - 1, 1);
while (q--)
{
int l, r;
int t;
cin >> t >> l >> r;
if (t == 2)
cout << query(0, n - 1, l, r - 1, 1) << endl;
else
update(1, 0, n - 1, l, r);
}
}