hdu 1166 区间求和
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int maxn=50002; int sum[maxn<<2],s[maxn],n,t; char str[10]; void pushUp(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; return; } void build(int rt,int l,int r) { if(l==r) { sum[rt]=s[l]; return; } int mid=(l+r)>>1; build(rt<<1,l,mid); build(rt<<1|1,mid+1,r); pushUp(rt); } void upDate(int rt,int l,int r,int idx,int data) { if(l==r) { sum[rt]+=data; return; } int mid=(l+r)>>1; if(mid>=idx) upDate(rt<<1,l,mid,idx,data); else upDate(rt<<1|1,mid+1,r,idx,data); pushUp(rt); } int query(int rt,int l,int r,int L,int R) { if(l>=L&&r<=R) { return sum[rt]; } int mid=(l+r)>>1; int res=0; if(mid>=L) res+=query(rt<<1,l,mid,L,R); if(R>mid) res+=query(rt<<1|1,mid+1,r,L,R); return res; } int main() { scanf("%d",&t); int i,j,k,l,r,cas=1; while(t--) { scanf("%d",&n); for(i=1; i<=n; i++)scanf("%d",&s[i]); build(1,1,n); printf("Case %d:\n",cas++); while(cin>>str,(str[0]!='E')) { if(str[0]=='A') { scanf("%d%d",&l,&r); upDate(1,1,n,l,r); } else if(str[0]=='S') { scanf("%d%d",&l,&r); upDate(1,1,n,l,-r); } else if(str[0]=='Q') { scanf("%d%d",&l,&r); printf("%d\n",query(1,1,n,l,r)); } } } return 0; }