Advertisement
royalsflush

HORRIBLE AC

Sep 2nd, 2012
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.43 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <algorithm>
  3. #include <string.h>
  4. using namespace std;
  5.  
  6. int t,n,c;
  7. long long tree[20*100010];
  8. long long valUp[20*100010];
  9.  
  10. void propagate(int root, int l, int r) {
  11.     tree[root]+=(long long)(r-l+1)*valUp[root];
  12.  
  13.     if (l<r) {
  14.         valUp[2*root+1]+=valUp[root];
  15.         valUp[2*root+2]+=valUp[root];
  16.     }
  17.  
  18.     valUp[root]=0;
  19. }
  20.  
  21. long long query(int root, int l, int r, int ql, int qr) {
  22.     propagate(root,l,r);
  23.  
  24.     if (ql<=l && qr>=r)
  25.         return tree[root];
  26.  
  27.     int mid=(l+r)/2;
  28.     long long sum=0;
  29.  
  30.     if (ql<=mid) sum+=query(2*root+1,l,mid,ql,min(qr,mid));
  31.     if (qr>mid) sum+=query(2*root+2,mid+1,r,max(ql,mid+1),qr);
  32.  
  33.     return sum;
  34. }
  35.  
  36. void update(int root, int l, int r, int ql, int qr, int val) {
  37.     if (ql<=l && qr>=r) {
  38.         tree[root]+=(long long)val*(r-l+1);
  39.        
  40.         if (l<r) {
  41.             valUp[2*root+1]+=val;
  42.             valUp[2*root+2]+=val;
  43.         }
  44.         return;
  45.     }
  46.  
  47.     int mid=(l+r)/2;
  48.  
  49.     if (ql<=mid) update(2*root+1,l,mid,ql,min(qr,mid),val);
  50.     if (qr>mid) update(2*root+2,mid+1,r,max(mid+1,ql),qr,val);
  51.  
  52.     propagate(2*root+1,l,mid);
  53.     propagate(2*root+2,mid+1,r);
  54.  
  55.     tree[root]=tree[2*root+1]+tree[2*root+2];
  56. }
  57.  
  58. int main() {
  59.     scanf("%d", &t);
  60.  
  61.     while (t--) {
  62.         scanf("%d %d", &n,&c);
  63.         memset(tree,0,sizeof(tree));
  64.         memset(valUp,0,sizeof(valUp));
  65.  
  66.         for (int i=0; i<c; i++) {
  67.             int ins,p,q;
  68.             scanf("%d %d %d", &ins,&p,&q);
  69.             p--, q--;
  70.  
  71.             if (ins==0) {
  72.                 int v;
  73.                 scanf("%d", &v);
  74.                 update(0,0,n-1,p,q,v);
  75.             }
  76.             else
  77.                 printf("%lld\n", query(0,0,n-1,p,q));
  78.         }
  79.     }
  80.  
  81.     return 0;
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement