首页 > 代码库 > HDU 1166

HDU 1166

线段树 




1
#include <cstdio> 2 #include <iostream> 3 using namespace std; 4 #define N 200010 5 int sum[N]; 6 void build(int l,int r,int root){ 7 if(l==r)scanf("%d",&sum[root]); 8 else { 9 int mid=(l+r)/2;10 build(l,mid,root*2);11 build(mid+1,r,root*2+1);12 sum[root]=sum[root*2]+sum[root*2+1];13 }14 }15 void add(int i,int j,int l,int r,int root){16 if(l==r)sum[root]+=j;17 else {18 int mid=(r+l)/2;19 if(i<=mid)add(i,j,l,mid,root*2);20 else add(i,j,mid+1,r,root*2+1);21 sum[root]=sum[root*2]+sum[root*2+1];22 }23 }24 void query(int x,int y,int l,int r,int root,int &a){25 if(x<=l&&y>=r){26 a+=sum[root];27 return;28 }29 int mid=(r+l)/2;30 if(x<=mid)query(x,y,l,mid,root*2,a);31 if(y>mid)query(x,y,mid+1,r,root*2+1,a);32 }33 int main(){34 freopen("test.txt","r",stdin);35 int t,n,q,x,y,case1=0;36 char s[7];37 scanf("%d",&t);38 while(t--){39 case1++;40 printf("Case %d:\n",case1);41 scanf("%d",&n);42 build(1,n,1);43 while(scanf("%s",s)!=EOF){44 if(s[0]==E)break;45 scanf("%d%d",&x,&y);46 switch (s[0]){47 case Q:q=0;query(x,y,1,n,1,q);printf("%d\n",q);break;48 case A:add(x,y,1,n,1);break;49 case S:add(x,-y,1,n,1);break;50 }51 }52 }53 return 0;54 }