Segment Trees
Segment Trees
Update queries
Naïve method update in O(1)
Range query in O(n)
Data structure
Build
Range queries(l,r)
Update query(index, value)
U452
U453
(0,7)
1
U452
U453
(0,7)
0
(4,7)
2
1 (0,3)
6 (6,7
5 (4,5)
(2,3)
3 4
(0,1)
8 9
7
0 1
8 + 4 +2 +1 = 15
N+n/2+n/4 ….. 1
N(1+1/2+1/4 …….)
N*(2)
2n is bare minimum we need
1
7) 4
ay?
N+n/2+n/4 ….. 1
N(1+1/2+1/4 …….)
N*(2)
2n is bare minimum we need
N not a power of 2
Convert it to next power of 2
8 9 16
15 16
In worst case we need to
double the size
2n *2 = 4n
A = input array
Build(a,0,n-1,1,tree)
Build(a, l,r,I,tree){
If(l == r){
Tree[i] = a[l];
Build(a, l,r,I,tree){
If(l == r){
Tree[i] = a[l];
}
Int mid = l + (r-l)/2;
Build(a,l,mid,2*I,tree);
Build(a,mid+1,2*i+1,tree);
Tree[i] = Tree[2*i]+tree[2*i+1];
}
Update(tree,index,value,treeindex,l,r){
If(l == r && l == index){
Tree[treeindex] = value;
}
Else{
Int mid = l + (r-l)/2;
If(index <= mid){
Update(tree, index, value, treeindex*2, l, mid)
}
Else{
Update(tree, index, value, treeindex*2+1, mid+1, r)
}
Tree[treeindex] = tree[treeindex*2]+tree[treeindex*2+1];
}
Range(l,r,tree, 1, 0,n-1)
Range(l,r,tree, 1, 0,n-1)
Rangequery(l,r,tree,treeindex,tl,tr){
If(tl >= l && tr <= r) return tree[treeindex];
If(tl < l || tr > r) return 0;
Int mid = l + (r-l)/2;
Return Rangequery(l,r,tree, 2*treeindex, tl, mid) + rangequery(l,r
2*treeindex+1, mid+1,tr);
}
o
How to merge two children nodes to make a parent node?
Parent node
1 2 -3 1 4 -5 2 1
Max sum subarry = max(lcmss,rcmss,lcmsufs+rcmps)
Max prefix sum = 5 max(lcps,rcmps+lcs)
Max suffix sum = 3 max(lcmsuffs+rcs,rcss)
Sum = lcs+rcs
1 2 -3 1 4 -5 2 1
Max sum subarry = 3 Max sum subarry = 3
Max prefix sum = 3 Max prefix sum = 4
Max suffix sum = 1 Max suffix sum = 3
Sum = 1 Sum = 2