http://acm.hdu.edu.cn/showproblem.php?pid=1166
老题新做,树状数组,比线段树省了300k内存
View Code
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> const int maxn=51000; int s[maxn]; int nCase=1,n; int lowbit(int i){return i&(-i);} void update(int i,int val) { while(i<=n) { s[i]+=val; i+=lowbit(i); } } int Sum(int i) { int sum=0; while(i>0) { sum+=s[i]; i-=lowbit(i); } return sum; } int main() { int t,i,val; scanf("%d",&t); while(t--) { memset(s,0,sizeof(s)); scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&val); update(i,val); } char op[10]; printf("Case %d:\n",nCase++); while(scanf("%s",op)) { if(op[0]=='E')break; int a,b; scanf("%d%d",&a,&b); if(op[0]=='A')update(a,b); else if(op[0]=='S')update(a,-b); else printf("%d\n",Sum(b)-Sum(a-1)); } } return 0; }