Advertisement
Manioc

ADDMUL

Apr 5th, 2019
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.21 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAX 1000007
  3.  
  4. using namespace std;
  5. typedef long long ll;
  6.  
  7. struct st{
  8.     ll ans, sum, mul, trans;
  9.  
  10.     st() {}
  11.     st(ll _ans, ll _sum, ll _mul, ll _trans): ans(_ans), sum(_sum), mul(_mul), trans(_trans){}
  12. };
  13. st seg[4*MAX];
  14. ll arr[MAX];
  15.  
  16. void transform(int id, int l, int r, ll val){
  17.     if(val > 0) seg[id].ans = (r-l+1)*val;
  18.     seg[id].trans += val;
  19. }
  20.  
  21. void mult(int id, int l, int r, ll val){
  22.     seg[id].ans *= val;
  23.     seg[id].mul *= val;
  24. }
  25.  
  26. void add(int id, int l, int r, ll val){
  27.     seg[id].ans += (r-l+1)*val;
  28.     seg[id].mul += val;
  29. }
  30.  
  31. void lazy(int id, int l, int r){
  32.     int mid = (l+r)/2;
  33.     add(2*id,l, mid, seg[id].sum);
  34.     add(2*id+1, mid+1, r, seg[id].sum);
  35.     seg[id].sum = 0;
  36.  
  37.     mult(2*id,l, mid, seg[id].mul);
  38.     mult(2*id+1, mid+1, r, seg[id].mul);
  39.     seg[id].mul = 1;
  40.  
  41.     transform(2*id,l, mid, seg[id].trans);
  42.     transform(2*id+1, mid+1, r, seg[id].trans);
  43.     seg[id].trans = 0;
  44. }
  45. void update(int id, int l, int r, int x, int y, ll val, int tipo){ //lazy
  46.     if(l > y || r < x) return;
  47.     else if( x <= l && r <= y){
  48.         if(tipo == 1) add(id, l, r, val);
  49.         if(tipo == 2) mult(id, l, r, val);
  50.         if(tipo == 3) transform(id, l, r, val);
  51.     }else{
  52.         int mid = (l+r)/2;
  53.         lazy(id, l, r);
  54.  
  55.         update(2*id, l, mid, x, y, val, tipo);
  56.         update(2*id+1, mid+1, r, x, y, val, tipo);
  57.         seg[id].ans = seg[2*id].ans + seg[2*id+1].ans;
  58.     }
  59. }
  60.  
  61. ll query(int id, int l, int r, int x, int y){
  62.     if(l > y || r < x) return 0;
  63.     else if( x <= l && r <= y) return seg[id].ans;
  64.     else{
  65.         int mid = (l+r)/2;
  66.         lazy(id, l, r);
  67.  
  68.         return query(2*id, l, mid, x, y) + query(2*id+1, mid+1, r, x, y);
  69.     }
  70. }
  71. int main(){
  72.     int n; scanf("%d", &n);
  73.     for(int i = 1; i <= n; i++) {
  74.         scanf("%lld", &arr[i]);
  75.         update(1, 1, n, i, i, arr[i], 1);
  76.     }
  77.  
  78.     int q; scanf("%d", &q);
  79.     while(q--){
  80.         int type, l, r; scanf("%d %d %d", &type, &l, &r);
  81.         if(type == 4){
  82.             printf("%lld\n", query(1, 1, n, l, r));
  83.             continue;
  84.         }
  85.         ll v; scanf("%lld", &v);
  86.         update(1, 1, n, l, r, v, type);
  87.     }
  88.     return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement