keverman

Segment tree [lazy propagation]

Feb 10th, 2020 (edited)
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.35 KB | None | 0 0
  1.  
  2. int n;
  3. vector<ll> st, lazy;
  4.  
  5. void build(vector<ll>& T)
  6. {
  7.     for (n = 1; n < T.size(); n *= 2);
  8.     st.resize(n * 2, 0), lazy.resize(n * 2, 0);
  9.  
  10.     for (int i = n; i < 2 * n; i++) st[i] = T[i - n];
  11.     for (int i = n - 1; i > 0; i--) st[i] = f(st[l(i)], st[r(i)]);
  12. }
  13.  
  14. inline void propagate(int v, int len)
  15. {
  16.     if (lazy[v] > 0)
  17.     {
  18.         st[v] += lazy[v] * len;
  19.         if (len > 1) lazy[l(v)] += lazy[v], lazy[r(v)] += lazy[v];
  20.         lazy[v] = 0;
  21.     }
  22. }
  23.  
  24. void update(int l, int r, int val, int v, int lhs, int rhs)
  25. {
  26.     if (lhs >= l && rhs <= r)
  27.     {
  28.         lazy[v] += val;
  29.         propagate(v, rhs - lhs + 1);
  30.     }
  31.     else
  32.     {
  33.         propagate(v, rhs - lhs + 1);
  34.         int m = lhs + (rhs - lhs) / 2;
  35.         if (m >= l)     update(l, r, val, l(v), lhs, m);
  36.         if (m + 1 <= r) update(l, r, val, r(v), m + 1, rhs);
  37.         st[v] = f(st[l(v)], st[r(v)]);
  38.     }
  39. }
  40. inline void update(int l, int r, int val)
  41. {
  42.     update(l, r, val, 1, 0, n - 1);
  43. }
  44.  
  45. ll query(int l, int r, int v, int lhs, int rhs)
  46. {
  47.     propagate(v, rhs - lhs + 1);
  48.     if (lhs >= l && rhs <= r)
  49.         return st[v];
  50.     int m = lhs + (rhs - lhs) / 2;
  51.     return f((m < l ? def : query(l, r, l(v), lhs, m)),
  52.         (m + 1 > r ? def : query(l, r, r(v), m + 1, rhs)));
  53. }
  54. inline ll query(int l, int r)
  55. {
  56.     return query(l, r, 1, 0, n - 1);
  57. }
Add Comment
Please, Sign In to add comment