forked from AhmadElsagheer/Competitive-programming-library
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPersistentSegmentTree.java
50 lines (43 loc) · 1.32 KB
/
PersistentSegmentTree.java
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
package data_structures.trees;
public class PersistentSegmentTree {
class Node
{
Node left, right; int sum;
Node(int x) { sum = x; }
Node(Node left, Node right)
{
this.left = left;
this.right = right;
if(left != null)
sum += left.sum;
if(right != null)
sum += right.sum;
}
}
Node build(int[] a, int l, int r) // returns root of the initial version, a is a power of 2 and 0-based
{
if(l == r)
return new Node(a[l - 1]);
int mid = (l + r) >> 1;
return new Node(build(a, l, mid), build(a, mid + 1, r));
}
int query(Node v, int l, int r, int b, int e)
{
if(e < l || r < b)
return 0;
if(b <= l && r <= e)
return v.sum;
int mid = (l + r) >> 1;
return query(v.left, l, mid, b, e) + query(v.right, mid + 1, r, b, e);
}
Node update(Node v, int l, int r, int idx, int val) // returns root of new version, idx is 1-basd
{
if(l == r)
return new Node(val);
int mid = (l + r) >> 1;
if(idx <= mid)
return new Node(update(v.left, l, mid, idx, val), v.right);
else
return new Node(v.left, update(v.right, mid + 1, r, idx, val));
}
}