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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| template<typename T, int MAX_N> struct SegTree { T tree[MAX_N*4+4]; T lazy[MAX_N*4+4]; T diff[MAX_N*4+4]; bool changed[MAX_N*4+4];
void clear() { memset(tree, 0, sizeof(tree)); memset(lazy, 0, sizeof(lazy)); memset(diff, 0, sizeof(diff)); memset(changed, 0, sizeof(changed)); } void pushdown(int rt, int s, int t, int mid) { if (changed[rt]) { tree[rt << 1] = lazy[rt] * (mid - s + 1); lazy[rt << 1] = lazy[rt]; diff[rt << 1] = 0; changed[rt << 1] = 1;
tree[rt << 1 | 1] = lazy[rt] * (t - mid); lazy[rt << 1 | 1] = lazy[rt]; diff[rt << 1 | 1] = 0; changed[rt << 1 | 1] = 1;
lazy[rt] = 0; changed[rt] = 0; } if (diff[rt]) { tree[rt << 1] += diff[rt] * (mid - s + 1); diff[rt << 1] += diff[rt]; tree[rt << 1 | 1] += diff[rt] * (t - mid); diff[rt << 1 | 1] += diff[rt]; diff[rt] = 0; } } void update(int rt, T val, int l, int r, int s, int t) { if (l <= s && r >= t) { diff[rt] = 0; tree[rt] = (t - s + 1) * val;; lazy[rt] = val; changed[rt] = 1; return; } int mid = s + ((t - s) >> 1); pushdown(rt, s, t, mid); if (l <= mid) update(rt << 1, val, l, r, s, mid); if (r > mid) update(rt << 1 | 1, val, l, r, mid + 1, t); tree[rt] = tree[rt << 1] + tree[rt << 1 | 1]; } void add(int rt, T val, int l, int r, int s, int t) { if (l <= s && r >= t) { diff[rt] += val; tree[rt] += (t - s + 1) * val;; return; } int mid = s + ((t - s) >> 1); pushdown(rt, s, t, mid); if (l <= mid) add(rt << 1, val, l, r, s, mid); if (r > mid) add(rt << 1 | 1, val, l, r, mid + 1, t); tree[rt] = tree[rt << 1] + tree[rt << 1 | 1]; } T query(int rt, int l, int r, int s, int t) { if (l <= s && r >= t) return tree[rt]; T ans = 0; int mid = s + ((t - s) >> 1); pushdown(rt, s, t, mid); if (l <= mid) ans += query(rt << 1, l, r, s, mid); if (r > mid) ans += query(rt << 1 | 1, l, r, mid + 1, t); return ans; }
void update(T val, int l, int r){ update(1, val, l, r, 1, MAX_N); } void add(T val, int l, int r){ add(1, val, l, r, 1, MAX_N); } T query(int l, int r){ return query(1, l, r, 1, MAX_N); } };
|