线段树

 

 

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 using namespace std;
  5 
  6 struct node
  7 {
  8     int left,right,flag;
  9     long long sum;
 10 }tree[600000];
 11 
 12 int n;
 13 int a[200001];
 14 string q;
 15 
 16 void build(int node,int left,int right)
 17 {
 18     tree[node].left=left;tree[node].right=right;
 19     if(left==right)
 20     {
 21         tree[node].sum=a[left];
 22         return;
 23     }
 24     int mid=(left+right)>>1;
 25     build(node<<1,left,mid);
 26     build(node<<1|1,mid+1,right);
 27     tree[node].sum=tree[node<<1].sum+tree[node<<1|1].sum;
 28 }
 29 
 30 void pushdown(int node)
 31 {
 32     int x=tree[node].right-tree[node].left+1;
 33     tree[node<<1].flag+=tree[node].flag;
 34     tree[node<<1|1].flag+=tree[node].flag;
 35     tree[node<<1].sum+=(x-(x>>1))*tree[node].flag;
 36     tree[node<<1|1].sum+=(x>>1)*tree[node].flag;
 37     tree[node].flag=0;
 38 }
 39 
 40 void update(int node,int left,int right,int x)
 41 {
 42     int mid=(tree[node].left+tree[node].right)>>1;
 43     tree[node].sum+=(right-left+1)*x;
 44     if(tree[node].left==left&&tree[node].right==right)
 45     {
 46         tree[node].flag+=x;
 47         return;
 48     }
 49     if(tree[node].left==tree[node].right) return;
 50     if(tree[node].flag>0) pushdown(node);
 51     if(right<=mid) update(node<<1,left,right,x);
 52     else if(left>mid) update(node<<1|1,left,right,x);
 53     else
 54     {
 55         update(node<<1,left,mid,x);
 56         update(node<<1|1,mid+1,right,x);
 57     }
 58     tree[node].sum=tree[node<<1].sum+tree[node<<1|1].sum;
 59 }
 60 
 61 void Add(int node,int pos,int x)
 62 {
 63     tree[node].sum+=x;
 64     if(tree[node].left!=tree[node].right)
 65     {
 66         int mid=(tree[node].left+tree[node].right)>>1;
 67         if(pos<mid)
 68             Add(node<<1,pos,x);
 69         else
 70             Add(node<<1|1,pos,x);
 71     }
 72 }
 73 
 74 long long query(int node,int left,int right)
 75 {
 76     int mid=(tree[node].left+tree[node].right)>>1;
 77     if(tree[node].left==left&&tree[node].right==right)
 78         return tree[node].sum;
 79     if(tree[node].flag>0) pushdown(node);
 80     if(right<=mid)
 81         return     query(node<<1,left,right);
 82     else if(left>mid)
 83         return query(node<<1|1,left,right);
 84     else
 85         return query(node<<1,left,mid)+query(node<<1|1,mid+1,right);
 86 }
 87 
 88 int main()
 89 {
 90     int T;
 91     cin>>T;
 92     for(int K=1;K<=T;K++)
 93     {
 94         printf("Case %d:\n");
 95         cin>>n;
 96         for(int i=1;i<=n;i++)
 97             cin>>a[i];
 98         build(1,1,n);
 99         while(cin>>q&&q!="End")
100         {
101             int t,x;
102             cin>>t>>x;
103             if(q=="Add") Add(1,t,x);
104             else if(q=="Sub") Add(1,t,-x);
105             else if(q=="Query") cout<<query(1,t,x)<<endl;
106         }
107     }
108     return 0;
109 }

 

posted @ 2017-01-23 15:50  InWILL  阅读(139)  评论(0)    收藏  举报