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
|
template <typename T=int> struct segtree { vector<T> tree, lazy; vector<bool> if_lazy; int n; void push(int cl, int cr, int p) { int cm = cl + (cr - cl) / 2; if (cl != cr && if_lazy[p]) { lazy[p * 2] = lazy[p],if_lazy[p*2] = 1; lazy[p * 2 + 1] = lazy[p],if_lazy[p*2+1] = 1; tree[p * 2] = lazy[p] * (cm - cl + 1); tree[p * 2 + 1] = lazy[p] * (cr - cm); lazy[p] = 0; if_lazy[p] = 0; } }
T query(int l, int r, int cl, int cr, int p) { if (l <= cl && cr <= r) return tree[p]; int m = cl + (cr - cl) / 2; T sum = T{}; push(cl, cr, p); if (l <= m) sum += query(l, r, cl, m, p * 2); if (r > m) sum += query(l, r, m + 1, cr, p * 2 + 1); return sum; }
void modify(int l, int r, T val, int cl, int cr, int p) { if (l <= cl && cr <= r) { lazy[p] = val; if_lazy[p] = 1; tree[p] = (cr - cl + 1) * val; return; } int m = cl + (cr - cl) / 2; push(cl, cr, p); if (l <= m) modify(l, r, val, cl, m, p * 2); if (r > m) modify(l, r, val, m + 1, cr, p * 2 + 1); tree[p] = tree[p * 2] + tree[p * 2 + 1]; }
void build(int s, int t, int p, vector<T> &arr) { if (s == t) { tree[p] = arr[s]; return; } int m = s + (t - s) / 2; build(s, m, p * 2, arr); build(m + 1, t, p * 2 + 1, arr); tree[p] = tree[p * 2] + tree[p * 2 + 1]; } void build(int s, int t, int p, T init) { if (s == t) { tree[p] = init; return; } int m = s + (t - s) / 2; build(s, m, p * 2, init); build(m + 1, t, p * 2 + 1, init); tree[p] = tree[p * 2] + tree[p * 2 + 1]; }
segtree(vector<T> &arr): n(arr.size()), tree(arr.size()<<2), lazy(arr.size()<<2), if_lazy((arr.size()<<2),0) { build(0, n-1, 1, arr); } segtree(int _n,T init): n(_n), tree(_n<<2), lazy(_n<<2), if_lazy((_n<<2),0) { build(0, n-1, 1, init); }
T query(int l, int r) { return query(l, r, 0, n-1, 1); } T operator()(int l,int r){ return query(l,r);} void modify(int l, int r, T val) { modify(l, r, val, 0, n-1, 1); } };
|