Advertisement
slash0t

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

Aug 2nd, 2024 (edited)
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.25 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.  
  16.     segtree(int n) {
  17.         size = 1;
  18.         while (size < n) size *= 2;
  19.  
  20.         t.assign(size * 2 - 1, { NO_OPERATION, ZERO });
  21.         build(0, 0, size);
  22.     }
  23.  
  24.     int modify(int a, int b, int len) {
  25.         if (b == NO_OPERATION) return a;
  26.         if (a == NO_OPERATION) return b;
  27.         return a + b;
  28.     }
  29.  
  30.     gett modify(gett a, int b, int len) {
  31.         if (b == NO_OPERATION) return a;
  32.         return { a.max + b };
  33.     }
  34.  
  35.     gett unite(gett a, gett b, int len) {
  36.         return { max(a.max, b.max) };
  37.     }
  38.  
  39.     void build(int x, int lx, int rx) {
  40.         if (rx - lx == 1) {
  41.             t[x] = { NO_OPERATION, ZERO };
  42.             return;
  43.         }
  44.         int m = (lx + rx) / 2;
  45.         build(x * 2 + 1, lx, m);
  46.         build(x * 2 + 2, m, rx);
  47.         t[x].modify = NO_OPERATION;
  48.         t[x].get = unite(t[x * 2 + 1].get, t[x * 2 + 2].get, rx - lx);
  49.     }
  50.  
  51.     void propagate(int x, int lx, int rx) {
  52.         if (rx - lx == 1 || t[x].modify == NO_OPERATION) return;
  53.         int m = (lx + rx) / 2;
  54.         t[x * 2 + 1].modify = modify(t[x * 2 + 1].modify, t[x].modify, 1);
  55.         t[x * 2 + 1].get = modify(t[x * 2 + 1].get, t[x].modify, m - lx);
  56.         t[x * 2 + 2].modify = modify(t[x * 2 + 2].modify, t[x].modify, 1);
  57.         t[x * 2 + 2].get = modify(t[x * 2 + 2].get, t[x].modify, rx - m);
  58.         t[x].modify = NO_OPERATION;
  59.     }
  60.  
  61.     void upd(int v, int l, int r, int x, int lx, int rx) {
  62.         propagate(x, lx, rx);
  63.         if (lx >= r || rx <= l) return;
  64.         if (lx >= l && rx <= r) {
  65.             t[x].modify = modify(t[x].modify, v, 1);
  66.             t[x].get = modify(t[x].get, v, rx - lx);
  67.             return;
  68.         }
  69.         int m = (lx + rx) / 2;
  70.         upd(v, l, r, x * 2 + 1, lx, m);
  71.         upd(v, l, r, x * 2 + 2, m, rx);
  72.         t[x].get = unite(t[x * 2 + 1].get, t[x * 2 + 2].get, min(rx, r) - max(lx, l));
  73.     }
  74.  
  75.     void upd(int v, int l, int r) {
  76.         return upd(v, l, r, 0, 0, size);
  77.     }
  78.  
  79.     gett get(int l, int r, int x, int lx, int rx) {
  80.         propagate(x, lx, rx);
  81.         if (lx >= r || rx <= l) return ZERO;
  82.         if (lx >= l && rx <= r) {
  83.             return t[x].get;
  84.         }
  85.         int m = (lx + rx) / 2;
  86.         gett a = get(l, r, x * 2 + 1, lx, m);
  87.         gett b = get(l, r, x * 2 + 2, m, rx);
  88.         return unite(a, b, min(rx, r) - max(lx, l));
  89.     }
  90.  
  91.     gett get(int l, int r) {
  92.         return get(l, r, 0, 0, size);
  93.     }
  94. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement