Advertisement
Guest User

Untitled

a guest
Jul 18th, 2018
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.41 KB | None | 0 0
  1.  
  2. template<class T>
  3. struct segtree { //[l;r)
  4.     int n;
  5.     vector<T> t;
  6.     vector<T> lazy;
  7.     segtree(int sz):n(1 << ((int)(log2(sz - 1)) + 1)), t(n + n,0), lazy(n + n, 0) {}
  8.     void push(int v, int l, int r) {
  9.         if (lazy[v] != 0 && v < n) {
  10.             int mid = (l + r) >> 1;
  11.             t[v * 2] += lazy[v] * (mid - l);
  12.             t[v * 2 + 1] += lazy[v] * (r - mid);
  13.             lazy[v * 2] += lazy[v];
  14.             lazy[v * 2 + 1] += lazy[v];
  15.             lazy[v] = 0;
  16.         }
  17.     }
  18.     void modify(int x, int y, T val, int root, int l, int r) {
  19.         if (x >= r || y <= l) return;
  20.         if (x <= l && r <= y) {
  21.             lazy[root] += val;
  22.             t[root] += val * (r - l);
  23.             return;
  24.         }
  25.         push(root, l, r);
  26.         int mid = (l + r) / 2;
  27.         modify(x, y, val, root * 2, l, mid);
  28.         modify(x, y, val, root * 2 + 1, mid, r);
  29.         t[root] = t[root * 2] + t[root * 2 + 1];
  30.     }
  31.     void modify(int x, int y, T val) {
  32.         modify(x, y, val, 1, 0, n);
  33.     }
  34.     T query(int x, int y, int root, int l, int r) {
  35.         if (x >= r || y <= l) return 0;
  36.         if (x <= l && r <= y) {
  37.             return t[root];
  38.         }
  39.         push(root, l, r);
  40.         int mid = (l + r) / 2;
  41.         return query(x, y, root * 2, l, mid) + query(x, y, root * 2 + 1, mid, r);
  42.     }
  43.     T query(int x, int y) {
  44.         return query(x, y, 1, 0, n);
  45.     }
  46. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement