Advertisement
slash0t

segtree upd(l,r) get(l,r) add/max

Aug 2nd, 2024 (edited)
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.82 KB | None | 0 0
  1. struct segtree {
  2.     struct gett {
  3.         int max;
  4.     };
  5.     struct node {
  6.         int modify;
  7.         gett get;
  8.     };
  9.  
  10.     vector<node> t;
  11.     int size;
  12.  
  13.     int NO_OPERATION = -inf;
  14.     gett ZERO = { 0 };
  15.     gett INITIAL = ZERO;
  16.  
  17.     segtree(int n) {
  18.         size = 1;
  19.         while (size < n) size *= 2;
  20.  
  21.         t.assign(size * 2 - 1, { NO_OPERATION, INITIAL });
  22.         build(0, 0, size);
  23.     }
  24.  
  25.     segtree(vector<int>& a) {
  26.         int n = a.size();
  27.         size = 1;
  28.         while (size < n) size *= 2;
  29.  
  30.         t.assign(size * 2 - 1, { NO_OPERATION, INITIAL });
  31.         build(a, 0, 0, size);
  32.     }
  33.  
  34.     int modify(int a, int b, int len) {
  35.         if (b == NO_OPERATION) return a;
  36.         if (a == NO_OPERATION) return b;
  37.         return a + b;
  38.     }
  39.  
  40.     gett modify(gett a, int b, int len) {
  41.         if (b == NO_OPERATION) return a;
  42.         return { a.max + b };
  43.     }
  44.  
  45.     gett unite(gett a, gett b, int len) {
  46.         return { max(a.max, b.max) };
  47.     }
  48.  
  49.     void build(vector<int>& a, int x, int lx, int rx) {
  50.         if (rx - lx == 1) {
  51.             t[x] = { NO_OPERATION, INITIAL };
  52.             if (lx < a.size()) t[x] = { NO_OPERATION, {a[lx]} };
  53.             return;
  54.         }
  55.         int m = (lx + rx) / 2;
  56.         build(a, x * 2 + 1, lx, m);
  57.         build(a, x * 2 + 2, m, rx);
  58.         t[x].modify = NO_OPERATION;
  59.         t[x].get = unite(t[x * 2 + 1].get, t[x * 2 + 2].get, rx - lx);
  60.     }
  61.  
  62.     void build(int x, int lx, int rx) {
  63.         if (rx - lx == 1) {
  64.             t[x] = { NO_OPERATION, INITIAL };
  65.             return;
  66.         }
  67.         int m = (lx + rx) / 2;
  68.         build(x * 2 + 1, lx, m);
  69.         build(x * 2 + 2, m, rx);
  70.         t[x].modify = NO_OPERATION;
  71.         t[x].get = unite(t[x * 2 + 1].get, t[x * 2 + 2].get, rx - lx);
  72.     }
  73.  
  74.     void propagate(int x, int lx, int rx) {
  75.         if (rx - lx == 1 || t[x].modify == NO_OPERATION) return;
  76.         int m = (lx + rx) / 2;
  77.         t[x * 2 + 1].modify = modify(t[x * 2 + 1].modify, t[x].modify, 1);
  78.         t[x * 2 + 1].get = modify(t[x * 2 + 1].get, t[x].modify, m - lx);
  79.         t[x * 2 + 2].modify = modify(t[x * 2 + 2].modify, t[x].modify, 1);
  80.         t[x * 2 + 2].get = modify(t[x * 2 + 2].get, t[x].modify, rx - m);
  81.         t[x].modify = NO_OPERATION;
  82.     }
  83.  
  84.     void upd(int v, int l, int r, int x, int lx, int rx) {
  85.         propagate(x, lx, rx);
  86.         if (lx >= r || rx <= l) return;
  87.         if (lx >= l && rx <= r) {
  88.             t[x].modify = modify(t[x].modify, v, 1);
  89.             t[x].get = modify(t[x].get, v, rx - lx);
  90.             return;
  91.         }
  92.         int m = (lx + rx) / 2;
  93.         upd(v, l, r, x * 2 + 1, lx, m);
  94.         upd(v, l, r, x * 2 + 2, m, rx);
  95.         t[x].get = unite(t[x * 2 + 1].get, t[x * 2 + 2].get, min(rx, r) - max(lx, l));
  96.     }
  97.  
  98.     void upd(int v, int l, int r) {
  99.         return upd(v, l, r, 0, 0, size);
  100.     }
  101.  
  102.     gett get(int l, int r, int x, int lx, int rx) {
  103.         propagate(x, lx, rx);
  104.         if (lx >= r || rx <= l) return ZERO;
  105.         if (lx >= l && rx <= r) {
  106.             return t[x].get;
  107.         }
  108.         int m = (lx + rx) / 2;
  109.         gett a = get(l, r, x * 2 + 1, lx, m);
  110.         gett b = get(l, r, x * 2 + 2, m, rx);
  111.         return unite(a, b, min(rx, r) - max(lx, l));
  112.     }
  113.  
  114.     gett get(int l, int r) {
  115.         return get(l, r, 0, 0, size);
  116.     }
  117. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement