Advertisement
slash0t

sqrt decomposition sum/addition

Oct 11th, 2024 (edited)
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.39 KB | None | 0 0
  1. struct sqrtdec {
  2.     int n, sq;
  3.     vector<int> val, dval, dadd;
  4.     sqrtdec(int nn) {
  5.         n = nn;
  6.         sq = 1;
  7.         while (sq * sq < n) sq++;
  8.         n = sq * sq;
  9.         val = vector<int>(n);
  10.         dval = vector<int>(sq);
  11.         dadd = vector<int>(sq);
  12.     }
  13.  
  14.     sqrtdec(vector<int>& a) {
  15.         n = a.size();
  16.         sq = 1;
  17.         while (sq * sq < n) sq++;
  18.         n = sq * sq;
  19.         val = a;
  20.         dval = vector<int>(sq);
  21.         for (int i = 0; i < n; i++) dval[i / sq] += a[i];
  22.         dadd = vector<int>(sq);
  23.     }
  24.  
  25.     void push(int pos) {
  26.         for (int i = sq * pos; i < sq * (pos + 1); i++) val[i] += dadd[pos];
  27.         dval[pos] += sq * dadd[pos];
  28.         dadd[pos] = 0;
  29.     }
  30.  
  31.     int get(int l, int r) {
  32.         int sum = 0;
  33.         int sql = l / sq + 1;
  34.         int sqr = r / sq - 1;
  35.         for (int i = sql; i <= sqr; i++) {
  36.             sum += dadd[i] * sq;
  37.             sum += dval[i];
  38.         }
  39.  
  40.         push(sql - 1);
  41.         for (int i = l; i < min(r + 1, sq * sql); i++) sum += val[i];
  42.  
  43.         if (sql - 2 != sqr) {
  44.             push(sqr + 1);
  45.             for (int i = sq * (sqr + 1); i <= r; i++) sum += val[i];
  46.         }
  47.         return sum;
  48.     }
  49.  
  50.     void upd(int l, int r, int v) {
  51.         int sql = l / sq + 1;
  52.         int sqr = r / sq - 1;
  53.         for (int i = sql; i <= sqr; i++) dadd[i] += v;
  54.  
  55.         push(sql - 1);
  56.         for (int i = l; i < min(r + 1, sq * sql); i++) {
  57.             dval[i / sq] += v;
  58.             val[i] += v;
  59.         }
  60.  
  61.         if (sql - 2 != sqr) {
  62.             push(sqr + 1);
  63.             for (int i = sq * (sqr + 1); i <= r; i++) {
  64.                 dval[i / sq] += v;
  65.                 val[i] += v;
  66.             }
  67.         }
  68.     }
  69. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement