Advertisement
willy108

CSES_1735WA.cpp

Jan 30th, 2021
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. #include <iostream>
  2. #include <cassert>
  3. #include <algorithm>
  4. #include <cstring>
  5. #define LC(n) (((n) << 1) + 1)
  6. #define RC(n) (((n) << 1) + 2)
  7. #define ll long long
  8. using namespace std;
  9. const int LOGN = 20, max_v = (1 << LOGN)*4;
  10. ll sum[max_v], add[max_v], set[max_v], arr[max_v];
  11. bool lz[max_v];
  12. int n, q, s = 1;
  13.  
  14. void push_down(int k, int L, int R){
  15.     if(L + 1 == R) return ;
  16.     if(lz[k]){
  17.         int mid = (L + R)/2;
  18.         set[LC(k)] = set[RC(k)] = set[k];
  19.         sum[LC(k)] = sum[RC(k)] = (ll)(mid - L) * set[k];
  20.         add[LC(k)] = add[RC(k)] = 0ll;
  21.         set[k] = lz[k] = 0ll;
  22.         lz[LC(k)] = lz[RC(k)] = 1;
  23.     }
  24. }
  25.  
  26. void U(int qL, int qR, int k, int op, ll val, int L, int R){
  27.     if(qR <= L || R <= qL || R <= L) return ;
  28.     if(qL <= L && R <= qR){
  29.         if(op == 2){//set
  30.             add[k] = 0ll;
  31.             sum[k] = (ll)(R - L) * val;
  32.             set[k] = val;
  33.             lz[k] = 1;
  34.         }else{
  35.             add[k] += val;
  36.         }
  37.         return ;      
  38.     }
  39.     push_down(k, L, R);
  40.     int mid = (L + R)/2;
  41.     U(qL, qR, LC(k), op, val, L, mid);
  42.     U(qL, qR, RC(k), op, val, mid, R);
  43.     sum[k] = sum[LC(k)] + sum[RC(k)] + (ll)(R - mid) * (add[LC(k)] + add[RC(k)]);
  44. }
  45.  
  46. ll S(int qL, int qR, int k, int L, int R){
  47.     if(qR <= L || R <= qL || R <= L) return 0ll;
  48.     if(qL <= L && R <= qR) return add[k]*(ll)(R - L) + sum[k];
  49.     push_down(k, L, R);
  50.     int mid = (L + R)/2;
  51.     return S(qL, qR, LC(k), L, mid) + S(qL, qR, RC(k), mid, R);
  52. }
  53.  
  54. void precomp(){
  55.     for(int i = s - 1; i<s + n - 1; i++){
  56.         sum[i] = arr[i - (s - 1)];
  57.     }
  58.     for(int i = s - 2; i >= 0; i--){
  59.         sum[i] = sum[LC(i)] + sum[RC(i)];
  60.     }
  61. }
  62.  
  63.  
  64. int main(){
  65.     cin.tie(0) -> sync_with_stdio(0);
  66.     cin >> n >> q;
  67.     while(s<=n) s <<= 1; s <<=1;
  68.     for(int i = 0; i<n; i++){
  69.         cin >> arr[i];
  70.     }
  71.     precomp();
  72.     while(q--){
  73.         int op; cin >> op;
  74.         if(op == 3){
  75.             int a, b; cin >> a >> b;
  76.             cout << S(a - 1, b, 0, 0, s) << '\n';
  77.             cout.flush();
  78.         }else{
  79.             int a, b; ll c;
  80.             cin >> a >> b >> c;
  81.             U(a - 1, b, 0, op, c, 0, s);
  82.         }
  83.     }
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement