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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| template<typename T> struct SegTree { #define lson (rt << 1) #define rson (rt << 1 | 1)
int n; vector<T> info;
SegTree() {} SegTree(vector<T> _init) { init(_init); }
void init(vector<T> _init) { n = _init.size() - 1; info.assign(n << 2, T()); auto build = [&](auto self, int rt, int l, int r) -> void { if (l == r) { info[rt] = _init[l]; return; } int m = l + r >> 1; self(self, lson, l, m); self(self, rson, m + 1, r); push_up(rt); }; build(build, 1, 1, n); }
void push_up(int rt) { info[rt] = info[lson] + info[rson]; }
void modify(int rt, int l, int r, int x, const T& v) { if (l == r) { info[rt] = v; return; } int m = l + r >> 1; if (x <= m) modify(lson, l, m, x, v); else modify(rson, m + 1, r, x, v); push_up(rt); }
void modify(int x, const T& v) { modify(1, 1, n, x, v); }
T rangeQuery(int rt, int l, int r, int x, int y) { if (l < 1 || x > r || y < l || r > n) { return T(); } if (l >= x && r <= y) { return info[rt]; } int m = l + r >> 1; return rangeQuery(lson, l, m, x, y) + rangeQuery(rson, m + 1, r, x, y); }
T rangeQuery(int l, int r) { return rangeQuery(1, 1, n, l, r); } };
struct Node { };
Node operator+ (const Node& a, const Node& b) { }
|