//http://acm.hdu.edu.cn/showproblem.php?pid=1166
//4671122 2011-09-28 13:02:52 Accepted 1166 31MS 412K 1396 B C++ nkhelloworld //4671125 2011-09-28 13:03:32 Accepted 1166 62MS 376K 1396 B G++ nkhelloworld //树状数组点更新求和,比线段树要快 #include <cstdio> #include <cstring> const int maxn = 50002; int BITtree[maxn]; int maxval; void BITinsert(int pos,int val) { while(pos <=maxval) { BITtree[pos] += val; pos += (pos & -pos); } } int BITsum(int pos) { int ret = 0; while(pos > 0) { ret += BITtree[pos]; pos -= pos & -pos; } return ret; } int main() { int totcase,numcase,i,j,tmp; scanf("%d",&totcase); char op[10]; for(numcase = 1;numcase<=totcase;numcase++) { printf("Case %d:\n",numcase); scanf("%d",&maxval); memset(BITtree,0,sizeof(BITtree)); for(i=1;i<=maxval;i++) { scanf("%d",&tmp); BITinsert(i,tmp); } while(scanf("%s",op)) { if(op[0] == 'E') break; scanf("%d%d",&i,&j); switch(op[0]) { case 'Q': { printf("%d\n",BITsum(j)-BITsum(i-1)); break; } case 'A': { BITinsert(i,j); break; } case 'S': { BITinsert(i,-j); break; } } } } return 0; }