Skip to content

Commit 2fc64c4

Browse files
Merge pull request #918 from Es7evam/PersistentSegTree
Add Persistent Segment Tree C++ code
2 parents 69e04d4 + e12f7b9 commit 2fc64c4

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
#define pb push_back
6+
#define mk make_pair
7+
#define fi first
8+
#define se second
9+
10+
typedef long long ll;
11+
typedef pair<int, int> ii;
12+
const int INF = 0x3f3f3f3f;
13+
const double PI = acos(-1.0);
14+
15+
const int N = 1e5 + 5, M = 3e7 + 7;
16+
int n, a[N];
17+
int root[N], nodes, L[M], R[M], seg[M];
18+
19+
int build (int l, int r) {
20+
int at = nodes++;
21+
22+
if (l == r) {
23+
seg[at] = a[at];
24+
} else {
25+
int m = (l + r)/2;
26+
L[at] = build (l, m);
27+
R[at] = build (m + 1, r);
28+
seg[at] = seg[L[at]] + seg[R[at]];
29+
}
30+
31+
return at;
32+
}
33+
34+
/* point update, v[p]++ */
35+
int update (int i, int l, int r, int p) {
36+
int at = nodes++;
37+
38+
if (l == r) {
39+
seg[at] = seg[i] + 1;
40+
} else {
41+
int m = (l + r)/2;
42+
if (p <= m) {
43+
L[at] = update (L[i], l, m, p);
44+
R[at] = R[i];
45+
} else {
46+
L[at] = L[i];
47+
R[at] = update (R[i], m + 1, r, p);
48+
}
49+
seg[at] = seg[L[at]] + seg[R[at]];
50+
}
51+
52+
return at;
53+
}
54+
55+
/* range query: v[A] + ... + v[B] */
56+
int A, B;
57+
int query (int i, int l, int r) {
58+
if (A > B) return 0;
59+
if (r < A or l > B) return 0;
60+
61+
if (l >= A and r <= B) {
62+
return seg[i];
63+
} else {
64+
int m = (l + r)/2;
65+
return query (L[i], l, m) + query (R[i], m + 1, r);
66+
}
67+
}

0 commit comments

Comments
 (0)