Advertisement
Guest User

Untitled

a guest
Sep 16th, 2021
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.00 KB | None | 0 0
  1. struct seg_tree1 {
  2.     int n;
  3.     vector<int> sum, add;
  4.  
  5.     seg_tree1(int _n) {
  6.         n = _n;
  7.         sum.resize(4*n);
  8.         add.resize(4*n);
  9.     }
  10.  
  11.     void upd(int l, int r, int lx, int rx, int v, int x) {
  12.         if (l >= rx || r <= lx) return;
  13.         sum[v] += (min(r, rx)-max(l, lx)) * x;
  14.  
  15.         if (l >= lx && r <= rx) {
  16.             add[v] += x;
  17.             return;
  18.         }
  19.         int m = (l + r) / 2;
  20.         upd(l, m, lx, rx, v*2+1, x);
  21.         upd(m, r, lx, rx, v*2+2, x);
  22.     }
  23.     void upd(int l, int r, int x) {
  24.         upd(0, n, l, r+1, 0, x);
  25.     }
  26.  
  27.     int ask(int l, int r, int lx, int rx, int v) {
  28.         if (l >= rx || r <= lx) return 0;
  29.         if (l >= lx && r <= rx) {
  30.             return sum[v];
  31.         }
  32.         int m = (l + r) / 2;
  33.         return ask(l, m, lx, rx, v*2+1) + ask(m, r, lx, rx, v*2+2) + (min(r, rx)-max(l, lx)) * add[v];
  34.     }
  35.     int ask(int l, int r) {
  36.         return ask(0, n, l, r+1, 0);
  37.     }
  38. };
  39.  
  40. struct seg_tree2 {
  41.     int n, m;
  42.     vector<seg_tree1> sum, add;
  43.     seg_tree2(int _n, int _m) {
  44.         n = _n; m = _m;
  45.         sum.resize(4*n, seg_tree1(m));
  46.         add.resize(4*n, seg_tree1(m));
  47.     }
  48.  
  49.     void upd(int l1, int r1, int lx, int rx, int l2, int r2, int v, int x) {
  50.         if (l1 >= rx || r1 <= lx) return;
  51.  
  52.         sum[v].upd(l2, r2, x * (min(rx, r1) - max(lx, l1)));
  53.         if (l1 >= lx && r1 <= rx) {
  54.             add[v].upd(l2, r2, x);
  55.             return;
  56.         }
  57.         int med = (l1 + r1) / 2;
  58.         upd(l1, med, lx, rx, l2, r2, v*2+1, x);
  59.         upd(med, r1, lx, rx, l2, r2, v*2+2, x);
  60.     }
  61.  
  62.     int ask(int l1, int r1, int lx, int rx, int l2, int r2, int v) {
  63.         if (l1 >= rx || r1 <= lx) return 0;
  64.         if (l1 >= lx && r1 <= rx) {
  65.             return sum[v].ask(l2, r2);
  66.         }
  67.         int med = (l1 + r1) / 2;
  68.         return ask(l1, med, lx, rx, l2, r2, v*2+1) + ask(med, r1, lx, rx, l2, r2, v*2+2)
  69.                + add[v].ask(l2, r2) * (min(rx, r1) - max(lx, l1));
  70.     }
  71. };
  72.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement