Advertisement
TAImatem

Ленивое ДО

Jan 10th, 2023
650
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.51 KB | None | 0 0
  1. vector<int> v(4 * n, 0);
  2.  
  3. vector<int> up(4 * n, 0);
  4.  
  5. int func(int l, int r)
  6. {
  7.     return l + r;
  8. }
  9.  
  10. void push_far(int p, int lf, int rf)
  11. {
  12.     if (lf != rf)
  13.     {
  14.         int m = (rf + lf) / 2;
  15.         v[p * 2] += up[p] * (m - lf + 1);
  16.         up[p * 2] += up[p];
  17.         v[p * 2 + 1] = up[p] * (rf - m);
  18.         up[p * 2 + 1] += up[p];
  19.     }
  20.     up[p] = 0;
  21. }
  22.  
  23. void setDO(int i, int num, int p = 1, int lf = 0, int rf = n - 1)
  24. {
  25.     if (rf == lf)
  26.     {
  27.         v[p] = num;
  28.         return;
  29.     }
  30.  
  31.     if (up[p])
  32.         push_far(p, lf, rf);
  33.  
  34.     int m = (rf + lf) / 2;
  35.     if (i <= m)
  36.         setDO(i, num, p * 2, lf, m);
  37.     else
  38.         setDO(i, num, p * 2 + 1, m + 1, rf);
  39.     v[p] = func(v[p * 2], v[p * 2 + 1]);
  40. }
  41.  
  42. int getDO(int l, int r, int p = 1, int lf = 0, int rf = n - 1)
  43. {
  44.     if (l == lf && r == rf)
  45.         return v[p];
  46.  
  47.     if (up[p])
  48.         push_far(p, lf, rf);
  49.  
  50.     int m = (rf + lf) / 2;
  51.     if (rf <= m)
  52.         return getDO(l, r, p * 2, lf, m);
  53.     if (lf > m)
  54.         return getDO(l, r, p * 2 + 1, m + 1, rf);
  55.     return func(getDO(l, m, p * 2, lf, m), getDO(m + 1, r, p * 2 + 1, m + 1, rf));
  56. }
  57.  
  58. void setPerDO(int l, int r, int inc, int p = 1, int lf = 0, int rf = n - 1)
  59. {
  60.     if (l == lf && r == rf)
  61.     {
  62.         v[p] += inc * (r - l + 1);
  63.         up[p] += inc;
  64.         return;
  65.     }
  66.  
  67.     if (up[p])
  68.         push_far(p, lf, rf);
  69.  
  70.     int m = (rf + lf) / 2;
  71.     if (rf <= m)
  72.     {
  73.         setPerDO(l, r, inc, p * 2, lf, m);
  74.     }
  75.     else if (lf > m)
  76.     {
  77.         setPerDO(l, r, inc, p * 2 + 1, m + 1, rf);
  78.     }
  79.     else
  80.     {
  81.         setPerDO(l, m, inc, p * 2, lf, m);
  82.         setPerDO(m + 1, r, inc, p * 2 + 1, m + 1, rf);
  83.     }
  84.     v[p] = func(v[p * 2], v[p * 2 + 1]);
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement