hdu1166 敌兵布阵(线段树)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> const int MAXN=50005; struct ty{ int l,r; int num; }; int num[MAXN]; ty dat[MAXN*3]; int Build(int a,int b,int i){ dat[i].l=a; dat[i].r=b; if(a==b) return dat[i].num=num[a]; int mid=(a+b)>>1; return dat[i].num=Build(a,mid,i<<1)+Build(mid+1,b,i<<1|1); } void Add(int a,int b,int i){ dat[i].num+=b; if(dat[i].l==a && dat[i].r==a) return; int mid=(dat[i].l+dat[i].r)>>1; if(a<=mid) Add(a,b,i<<1); else Add(a,b,i<<1|1); } int Query(int a,int b,int i){ if(dat[i].l==a && dat[i].r==b) return dat[i].num; int mid=(dat[i].l+dat[i].r)>>1; if(b<=mid) return Query(a,b,i<<1); else if(a>mid) return Query(a,b,i<<1|1); else return Query(a,mid,i<<1)+Query(mid+1,b,i<<1|1); } int main(){ //freopen("in.txt","r",stdin); int t,index,n,a,b; char cmd[16]; scanf("%d",&t); for(index=1;index<=t;index++){ printf("Case %d:\n",index); scanf("%d",&n); int i; for(i=1;i<=n;i++){ scanf("%d",num+i); } Build(1,n,1); while(scanf("%s",cmd),cmd[0]!='E'){ scanf("%d%d",&a,&b); if(cmd[0]=='A') Add(a,b,1); else if(cmd[0]=='S') Add(a,-b,1); else printf("%d\n",Query(a,b,1)); } } return 0; }