Advertisement
tiom4eg

pain

Dec 20th, 2021
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.64 KB | None | 0 0
  1. struct segtree {
  2.     struct node {
  3.         int v, d = -1;
  4.     };
  5.  
  6.     vector <node> tree;
  7.  
  8.     void init(const vector <int>& v) {
  9.         tree.resize(2 * R);
  10.         FOR1(0, v.size()) tree[R + i].v = v[i];
  11.         RFOR(R - 1, 1) tree[l].v = tree[l * 2].v + tree[l * 2 + 1].v;
  12.     }
  13.  
  14.     int cnt(int len, int node) {
  15.         if (tree[node].d == 0) return len - tree[node].v;
  16.         if (tree[node].d == 1) return tree[node].v;
  17.         if (tree[node].d == 2) return 0;
  18.         if (tree[node].d == 3) return len;
  19.     }
  20.  
  21.     void push(int node, int len) {
  22.         if (tree[node].d == -1) return;
  23.         tree[node * 2].d = tree[node].d;
  24.         tree[node * 2].v = cnt(len >> 1, node * 2);
  25.         tree[node * 2 + 1].d = tree[node].d;
  26.         tree[node * 2 + 1].v = cnt(len >> 1, node * 2 + 1);
  27.         tree[node].d = -1;
  28.     }
  29.  
  30.     void upd(int ql, int qr, int val, int node = 1, int nl = 0, int nr = R) {
  31.         if (qr <= nl || nr <= ql) return;
  32.         if (ql <= nl && nr <= qr) {
  33.             tree[node].d = val;
  34.             tree[node].v = cnt(nr - nl, node);
  35.             return;
  36.         }
  37.         push(node, nr - nl);
  38.         int nm = (nl + nr) >> 1;
  39.         upd(ql, qr, val, node * 2, nl, nm);
  40.         upd(ql, qr, val, node * 2 + 1, nm, nr);
  41.         tree[node].v = tree[node * 2].v + tree[node * 2 + 1].v;
  42.     }
  43.  
  44.     int rsq(int ql, int qr, int node = 1, int nl = 0, int nr = R) {
  45.         if (qr <= nl || nr <= ql) return 0;
  46.         if (ql <= nl && nr <= qr) return tree[node].v;
  47.         push(node, nr - nl);
  48.         int nm = (nl + nr) >> 1;
  49.         return rsq(ql, qr, node * 2, nl, nm) + rsq(ql, qr, node * 2 + 1, nm, nr);
  50.     }
  51. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement