Skip to content

Commit 90cb65e

Browse files
authored
Add template for segment tree
1 parent 079e6fc commit 90cb65e

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed

segtree.cpp

+83
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
#include <bits/stdc++.h>
2+
#define MAXN 100000
3+
4+
vector<int> seg(4 * MAXN + 2), lazy(4 * MAXN + 2);
5+
6+
int left(int i) {
7+
return 2*i+1;
8+
}
9+
10+
int right(int i) {
11+
return 2*i+2;
12+
}
13+
14+
void propagate(int idx) {
15+
seg[idx] += lazy[idx];
16+
lazy[left(idx)] += lazy[idx];
17+
lazy[right(idx)] += lazy[idx];
18+
lazy[idx] = 0;
19+
}
20+
21+
void radd(int ql, int qr, int val, int l, int r, int idx) {
22+
if (l > r) return;
23+
if (l != r) propagate(idx);
24+
25+
if (ql > r or qr < l) return;
26+
27+
if (ql <= l and r <= qr) {
28+
lazy[idx] += val;
29+
if (l != r) propagate(idx);
30+
return;
31+
}
32+
33+
int m = l + (r - l) / 2;
34+
radd(ql, qr, val, l, m, left(idx));
35+
radd(ql, qr, val, m+1, r, right(idx));
36+
}
37+
38+
void radd(int ql, int qr, int val, int n) {
39+
radd(ql, qr, val, 0, n-1, 0);
40+
}
41+
42+
int pquery(int pos, int l, int r, int idx) {
43+
if (l == r) {
44+
seg[idx] += lazy[idx];
45+
lazy[idx] = 0;
46+
return seg[idx];
47+
}
48+
propagate(idx);
49+
int m = l + (r - l) / 2;
50+
if (pos <= m) return pquery(pos, l, m, left(idx));
51+
return pquery(pos, m+1, r, right(idx));
52+
}
53+
54+
int pquery(int pos, int n) {
55+
return pquery(pos, 0, n-1, 0);
56+
}
57+
58+
void add(int pos, int val, int l, int r, int idx) {
59+
if (l == r) {
60+
seg[idx] += val;
61+
return;
62+
}
63+
int m = l + (r - l) / 2;
64+
if (pos <= m) add(pos, val, l, m, left(idx));
65+
else add(pos, val, m+1, r, right(idx));
66+
seg[idx] += val;
67+
}
68+
69+
void add(int pos, int val, int n) {
70+
add(pos, val, 0, n-1, 0);
71+
}
72+
73+
int query(int ql, int qr, int l, int r, int idx) {
74+
if (ql > r or qr < l or l > r) return 0;
75+
if (ql <= l and r <= qr) return seg[idx];
76+
if (l == r) return seg[l];
77+
int m = l + (r - l) / 2;
78+
return query(ql, qr, l, m, left(idx)) + query(ql, qr, m+1, r, right(idx));
79+
}
80+
81+
int query(int ql, int qr, int n) {
82+
return query(ql, qr, 0, n-1, 0);
83+
}

0 commit comments

Comments
 (0)