nq1s788

ДО с массовыми операциями

Jun 1st, 2025
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.86 KB | None | 0 0
  1. #include <iostream>
  2. #include <set>
  3. #include <vector>
  4. #include <deque>
  5.  
  6. #define se second
  7. #define fi first
  8. #define mp make_pair
  9. #define pb push_back
  10.  
  11. using namespace std;
  12.  
  13. vector<int> tree;
  14. vector<int> a;
  15. vector<int> p;
  16.  
  17. void push(int t, int l, int r) {
  18.     if (p[t] == 0) return;
  19.     if (r - l == 1) {
  20.         tree[t] += p[t];
  21.     } else {
  22.         tree[t] += (r - l) * p[t];
  23.         p[t * 2 + 1] += p[t];
  24.         p[t * 2 + 2] += p[t];
  25.     }
  26.     p[t] = 0;
  27. }
  28.  
  29. int get_sum(int t, int l, int r, int L, int R) {
  30.     push(t, l, r);
  31.     if ((r <= L) || (R <= l)) return 0;
  32.     if ((L <= l) && (r <= R)) return tree[t];
  33.     int m = (r + l) / 2;
  34.     return get_sum(t * 2 + 1, l, m, L, R) + get_sum(t * 2 + 2, m, r, L, R);
  35. }
  36.  
  37. void update(int t, int l, int r, int L, int R, int x) {
  38.     push(t, l, r);
  39.     if ((r <= L) || (R <= l)) return;
  40.     if ((L <= l) && (r <= R)) {
  41.         p[t] += x;
  42.         return;
  43.     }
  44.     int m = (r + l) / 2;
  45.     update(t * 2 + 1, l, m, L, R, x);
  46.     update(t * 2 + 2, m, r, L, R, x);
  47. }
  48.  
  49. void build(int t, int l, int r) {
  50.     if (r - l == 1) {
  51.         tree[t] = a[l];
  52.         return;
  53.     }
  54.     int m = (r + l) / 2;
  55.     build(2 * t + 1, l, m);
  56.     build(2 * t + 2, m, r);
  57.     tree[t] = tree[t * 2 + 1] + tree[t * 2 + 2];
  58. }
  59.  
  60. int main() {
  61.     int n;
  62.     cin >> n;
  63.     a.resize(n);
  64.     for (auto& e : a) cin >> e;
  65.     tree.assign(4 * n, 0);
  66.     p.assign(4 * n, 0);
  67.     build(0, 0, n);
  68.     int t;
  69.     cin >> t;
  70.     while (t--) {
  71.         int req;
  72.         cin >> req;
  73.         if (req == 1) {
  74.             int l, r;
  75.             cin >> l >> r; ///левая и правая граница запроса, с 1
  76.             cout << get_sum(0, 0, n, l - 1, r) << '\n';
  77.         } else {
  78.             int i, x;
  79.             cin >> i >> x; ///a[i] = x;
  80.             update(0, 0, n, i - 1, x);
  81.         }
  82.     }
  83.     return 0;
  84. }
  85.  
Advertisement
Add Comment
Please, Sign In to add comment