Advertisement
Manioc

caralho preguiçoso e segmentado

Apr 20th, 2018
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.61 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAX 100007
  3.  
  4. typedef long long ll;
  5. using namespace std;
  6.  
  7. ll st[4*MAX], acum[4*MAX];
  8.  
  9. void build(int id, int l, int r){
  10.     if(l == r) st[id] = 0;
  11.     else{
  12.         int mid = (l + r)/2;
  13.         build(2*id, l, mid);
  14.         build(2*id+1, mid+1, r);
  15.         st[id] =  st[2*id] + st[2*id+1];
  16.     }
  17. }
  18.  
  19. void add(int id, int l, int r, int val){
  20.     st[id] = val*(r-l+1);
  21.     acum[id] += val;
  22. }
  23. void f5(int id, int l, int r, int x, int y, int val){
  24.     if(l > y || r < x) return;
  25.     else if(x <= l && r <= y) add(id, l, r, val);
  26.     else{
  27.         int mid = (l+r)/2;
  28.         add(2*id, l, mid, acum[id]);
  29.         add(2*id+1, mid+1, r, acum[id]);
  30.         acum[id] = 0;
  31.         f5(2*id, l, mid, x, y, val);
  32.         f5(2*id+1, mid+1, r, x, y, val);
  33.         st[id] = st[2*id] + st[2*id+1];
  34.     }
  35. }
  36.  
  37. ll query(int id, int l, int r, int x, int y){
  38.     if(l > y || r < x) return 0;
  39.     else if(x <= l && r <= y) return st[id];
  40.     else{
  41.         int mid = (l+r)/2;
  42.         add(2*id, l, mid, acum[id]);
  43.         add(2*id+1, mid+1, r, acum[id]);
  44.         acum[id] = 0;
  45.         return query(2*id, l, mid, x, y) + query(2*id+1, mid+1, r, x, y);
  46.     }
  47. }
  48. int main(){
  49.     int cases; scanf("%d", &cases);
  50.     while(cases--){
  51.         int n, c; scanf("%d %d", &n, &c);
  52.         build(1, 0, n-1);
  53.         while(c--){
  54.             int tipo, l, r; scanf("%d %d %d", &tipo, &l, &r);
  55.             if(!tipo){
  56.                 int val; scanf("%d", &val);
  57.                 f5(1, 0, n-1, l-1, r-1, val);
  58.             }else printf("%lld\n", query(1, 0, n-1, l-1, r-1));
  59.         }
  60.     }
  61.     return 0;
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement