$cat templates/segment-tree
Segment Tree
Point update, range query segment tree
#seg-tree#range-query#point-update
$cat code/
cpp
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
template<typename T>
struct SegTree {
int n;
vector<T> tree;
T (*op)(T, T);
T neutral;
SegTree(int _n, T (*_op)(T, T), T _neutral) : n(_n), op(_op), neutral(_neutral) {
tree.assign(2 * n, neutral);
}
void update(int idx, T val) {
for (tree[idx += n] = val; idx > 1; idx >>= 1)
tree[idx >> 1] = op(tree[idx], tree[idx ^ 1]);
}
T query(int l, int r) {
T resL = neutral, resR = neutral;
for (l += n, r += n + 1; l < r; l >>= 1, r >>= 1) {
if (l & 1) resL = op(resL, tree[l++]);
if (r & 1) resR = op(tree[--r], resR);
}
return op(resL, resR);
}
};22 linesutf-8
$cat notes.txt
Can be adapted for sum, min, max, gcd. Use iterative (bottom-up) for speed.