ProgMe

Untitled

Nov 26th, 2023
746
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.38 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int int64_t
  3.  
  4. using namespace std;
  5.  
  6. constexpr int N = 300;
  7.  
  8. class sqrt_decomposition{
  9.     vector<long long> a, d, lz;
  10.     static inline bool in(int b, int l, int r){
  11.         int L =  b * N, R = L + N - 1;
  12.         return L >= l && R <= r;
  13.     }
  14.     inline void native_upd(int b, int l, int r, int val){
  15.         int L = b * N, R = L + N - 1;
  16.         d[b] = 0;
  17.         for(int i = L; i <= R; i++){
  18.             a[i] += lz[b];
  19.             if(l <= i && i <= r)
  20.                 a[i] += val;
  21.             d[b] += a[i];
  22.         }
  23.         lz[b] = 0;
  24.     }
  25.     long long native_get(int b, int l, int r){
  26.         int L = b * N, R = L + N - 1;
  27.         long long ans = 0;
  28.         d[b] = 0;
  29.         for(int i = L; i <= R; i++){
  30.             a[i] += lz[b];
  31.             if(l <= i && i <= r)
  32.                 ans += a[i];
  33.             d[b] += a[i];
  34.         }
  35.         lz[b] = 0;
  36.         return ans;
  37.     }
  38. public:
  39.     sqrt_decomposition() = default;
  40.     sqrt_decomposition(vector<long long> &in){
  41.         a = in;
  42.         while(a.size() % N)
  43.             a.push_back(0);
  44.         d.assign(a.size() / N, 0LL);
  45.         lz.assign(a.size() / N, 0LL);
  46.         for(int i = 0; i < a.size(); i++)
  47.             d[i / N] += a[i];
  48.     }
  49.     void update(int l, int r, int x){
  50.         int L = l / N, R = r / N;
  51.         for(int i = L; i <= R; i++)
  52.             if(in(i, l, r)) {
  53.                 d[i] += N * x;
  54.                 lz[i] += x;
  55.             }
  56.             else
  57.                 native_upd(i, l, r, x);
  58.     }
  59.     long long get(int l, int r){
  60.         int L = l / N, R = r / N;
  61.         long long ans = 0;
  62.         for(int i = L; i <= R; i++){
  63.             if(in(i, l, r))
  64.                 ans += d[i];
  65.             else
  66.                 ans += native_get(i, l, r);
  67.         }
  68.         return ans;
  69.     }
  70. };
  71.  
  72. int32_t main()
  73. {
  74.     ios::sync_with_stdio(false);
  75.     cin.tie(nullptr); cout.tie(nullptr);
  76.     int n, q;
  77.     cin >> n >> q;
  78.     vector<long long> a(n);
  79.     for(auto &i: a)
  80.         cin >> i;
  81.     sqrt_decomposition d(a);
  82.     while (q--){
  83.         int t;
  84.         cin >> t;
  85.         if(t == 1){
  86.             int l, r;
  87.             cin >> l >> r;
  88.             l--, r--;
  89.             cout << d.get(l, r) << '\n';
  90.         }
  91.         else{
  92.             int l, r, v;
  93.             cin >> l >> r >> v;
  94.             l--, r--;
  95.             d.update(l, r, v);
  96.         }
  97.     }
  98. }
Advertisement
Add Comment
Please, Sign In to add comment