Salvens

Untitled

Jul 27th, 2023 (edited)
1,022
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.06 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define int long long
  5.  
  6. const int INF = 1e18 + 7;
  7. const int MAXN = 1e6 + 10;
  8.  
  9.  
  10. array<int, 4 * MAXN> tree, sum, a;
  11. array<int, 4 * MAXN> add;
  12.  
  13. void build(int x, int lx, int rx) {
  14.     if (rx - lx == 1) {
  15.         tree[x] = a[lx] * (lx + 1);
  16.         sum[x] = a[lx];
  17.         return;
  18.     }
  19.     int m = (lx + rx) / 2;
  20.     build(2 * x + 1, lx, m);
  21.     build(2 * x + 2, m, rx);
  22.     tree[x] = tree[2 * x + 1] + tree[2 * x + 2];
  23.     sum[x] = sum[2 * x + 1] + sum[2 * x + 2];
  24. }
  25.  
  26. void push(int x, int lx, int rx) {
  27.     sum[x] += (rx - lx) * add[x];
  28.     tree[x] += add[x] * (lx + 1 + rx) * (rx - lx) / 2;
  29.     if (rx - lx != 1) {
  30.         add[2 * x + 1] += add[x];
  31.         add[2 * x + 2] += add[x];
  32.     }
  33.     add[x] = 0;
  34. }
  35.  
  36. void update(int x, int lx, int rx, int l, int r, int v) {
  37.     push(x, lx, rx);
  38.     if (lx >= r || rx <= l) {
  39.         return;
  40.     }
  41.     if (lx >= l && rx <= r) {
  42.         add[x] += v;
  43.         push(x, lx, rx);
  44.         return;
  45.     }
  46.     int m = (lx + rx) / 2;
  47.     update(2 * x + 1, lx, m, l, r, v);
  48.     update(2 * x + 2, m, rx, l, r, v);
  49.     tree[x] = tree[2 * x + 1] + tree[2 * x + 2];
  50.     sum[x] = sum[2 * x + 1] + sum[2 * x + 2];
  51. }
  52.  
  53. int get(int x, int lx, int rx, int l, int r) {
  54.     push(x, lx, rx);
  55.     if (lx >= r || rx <= l) {
  56.         return 0;
  57.     }
  58.     if (lx >= l && rx <= r) {
  59.         return tree[x] - sum[x] * l;
  60.     }
  61.     int m = (lx + rx) / 2;
  62.     return get(2 * x + 1, lx, m, l, r) + get(2 * x + 2, m, rx, l, r);
  63. }
  64.  
  65. signed main() {
  66.     ios_base::sync_with_stdio(false);
  67.     cin.tie(nullptr);
  68.     int n, m;
  69.     cin >> n >> m;
  70.     for (int i = 0; i < n; ++i) {
  71.         cin >> a[i];
  72.     }
  73.     build(0, 0, n);
  74.     for (int i = 0; i < m; ++i) {
  75.         int t;
  76.         cin >> t;
  77.         if (t == 1) {
  78.             int l, r, d;
  79.             cin >> l >> r >> d;
  80.             --l;
  81.             update(0, 0, n, l, r, d);
  82.         } else {
  83.             int l, r;
  84.             cin >> l >> r;
  85.             --l;
  86.             cout << get(0, 0, n, l, r) << '\n';
  87.         }
  88.     }
  89. }
Advertisement
Add Comment
Please, Sign In to add comment