jainbot27

Untitled

Oct 3rd, 2021
1,457
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.09 KB | None | 0 0
  1. template <class V, int SZ> struct lazy {
  2.     // Remember to change everything!
  3.     const V ne = 0, MADD = 0, VAL = 0, MSET = 1e18;
  4.     vector<V> val, madd, mset;
  5.     lazy() {
  6.         val = madd = mset = vector<V>(2 * SZ);
  7.         vector<V> sp;
  8.         build(0, SZ, 1, sp);
  9.     }
  10.     lazy(vector<V> x) {
  11.         val = madd = mset = vector<V>(2 * SZ);
  12.         build(0, SZ, 1, x);
  13.     }
  14.     void pull(int ind) {
  15.         val[ind] = val[ind * 2] + val[ind * 2 + 1];
  16.     }
  17.     void build(int lo, int hi, int ind, vector<V> &v) {
  18.         if (lo + 1 < hi) {
  19.             int mid = (lo + hi) / 2;
  20.             build(lo, mid, ind * 2, v);
  21.             build(mid, hi, ind * 2 + 1, v);
  22.             pull(ind);
  23.         } else
  24.             val[ind] = (lo < (int)v.size() ? v[lo] : VAL);
  25.         mset[ind] = MSET, madd[ind] = MADD;
  26.     }
  27.     V query(int L, int R, int ind = 1, int lo = 0, int hi = SZ) {
  28.         if (R <= lo || hi <= L) return ne;
  29.         if (L <= lo && hi <= R) return val[ind];
  30.         push(ind, lo, hi);
  31.         int mid = (lo + hi) / 2;
  32.         return query(L, R, ind * 2, lo, mid) +
  33.                query(L, R, ind * 2 + 1, mid, hi);
  34.     }
  35.     void set(int L, int R, V x, int ind = 1, int lo = 0, int hi = SZ) {
  36.         if (R <= lo || hi <= L) return;
  37.         if (L <= lo && hi <= R)
  38.             mset[ind] = x, val[ind] = mset[ind] * (hi - lo), madd[ind] = 0;
  39.         else {
  40.             push(ind, lo, hi);
  41.             int mid = (lo + hi) / 2;
  42.             set(L, R, x, ind * 2, lo, mid);
  43.             set(L, R, x, ind * 2 + 1, mid, hi);
  44.             pull(ind);
  45.         }
  46.     }
  47.     void add(int L, int R, V x, int ind = 1, int lo = 0, int hi = SZ) {
  48.         if (R <= lo || hi <= L) return;
  49.         if (L <= lo && hi <= R) {
  50.             if (mset[ind] != MSET)
  51.                 mset[ind] += x;
  52.             else
  53.                 madd[ind] += x;
  54.             val[ind] += x * (hi - lo);
  55.         } else {
  56.             push(ind, lo, hi);
  57.             int mid = (lo + hi) / 2;
  58.             add(L, R, x, ind * 2, lo, mid);
  59.             add(L, R, x, ind * 2 + 1, mid, hi);
  60.             pull(ind);
  61.         }
  62.     }
  63.     void push(int ind, int lo, int hi) {
  64.         int mid = (lo + hi) / 2;
  65.         if (mset[ind] != MSET) {
  66.             set(lo, mid, mset[ind], ind * 2, lo, mid);
  67.             set(mid, hi, mset[ind], ind * 2 + 1, mid, hi);
  68.             mset[ind] = MSET;
  69.         } else if (madd[ind] != MADD) {
  70.             add(lo, mid, madd[ind], ind * 2, lo, mid);
  71.             add(mid, hi, madd[ind], ind * 2 + 1, mid, hi);
  72.             madd[ind] = 0;
  73.         }
  74.     }
  75. };
Advertisement
Add Comment
Please, Sign In to add comment