SegmentTree
Segment Tree
1. Introduction
2. Construction
void build(int id, int l, int r) {
if (l == r) {
// Leaf node will have a single element
tree[id] = A[l];
return;
}
int m = (l + r) / 2;
build(id * 2, l, m);
build(id * 2 + 1, m + 1, r);
tree[id] = tree[id * 2] + tree[id * 2 + 1];
}
int query(int id, int l, int r, int x, int y) {
//if total overlap return the value
if (x <= l && r <= y) {
return tree[id];
}
//if no overlap return 0
if (r < x || y < l) {
return 0;
}
int m = (l + r) / 2;
//if partial overlap go down
return query(id * 2, l, m, x, y) + query(id * 2 + 1, m + 1, r, x, y);
}
void update(int id, int l, int r, int pos, int val) {
if (l == r) {
tree[id] = val;
return;
}
int m = (l + r) / 2;
if (pos <= m) {
update(id * 2, l, m, pos, val);
} else {
update(id * 2 + 1, m + 1, r, pos, val);
}
tree[id] = tree[id * 2] + tree[id * 2 + 1];
}Range Update Query :
Range update query means updateing the values of array of a given range. We use the concept of Lazy Propagation to update the values of a given range.
2D Prefix Sum :
2D Prefix sum pre[i][j] stores the sum of all elements in rectangle whose top left corner is (0,0) and bottom right corner is (i,j).
Last updated