维护一个整数序列,支持3种操作:
1、将指定的数加上一个值;
2、将指定的数减去一个值;
3、查询指定区间的和。
View Code
#include <stdio.h> #define N 50001 int t,n,D; int sum[4*N]; void init() { int i; for(D=1;D<n+2;D<<=1); for(i=1;i<2*D;i++) sum[i]=0; for(i=1;i<=n;i++) scanf("%d",&sum[i+D]); for(i=D-1;i^1;i--) sum[i]=sum[i<<1]+sum[i<<1|1]; } void update(int x,int y) { sum[x+D]+=y; for(x=x+D;x^1;x>>=1) sum[x>>1]=sum[x]+sum[x^1]; } void get(int x,int y) { int i=x+D-1,j=y+D+1,ret=0; for(;i^j^1;i>>=1,j>>=1) { if(~i&1) ret+=sum[i^1]; if(j&1) ret+=sum[j^1]; } printf("%d\n",ret); } int main() { int a,b,kase=0; char s[10]; scanf("%d",&t); while(t--) { scanf("%d",&n); init(); printf("Case %d:\n",++kase); while(1) { s[0]=0; while(s[0]!='A' && s[0]!='Q' && s[0]!='S' && s[0]!='E') scanf("%s",s); if(s[0]=='E') break; scanf("%d%d",&a,&b); if(s[0]=='A') update(a,b); else if(s[0]=='S') update(a,-b); else get(a,b); } } return 0; }