题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
树状数组入门题就不解释了!
#include <string.h>
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 60000
int c[maxn];
int n;
char str[10];
int lowbit(int pos){
return (-pos)&pos;
}
int add(int pos,int num){
while(pos<=n){
c[pos]+=num;
pos+=lowbit(pos);
}
return 0;
}
int sum(int pos){
int ans=0;
while(pos>0){
ans+=c[pos];
pos-=lowbit(pos);
}
return ans;
}
int main(){
int i,j,k,t,a,b,ca=0;
scanf("%d",&t);
while(t--){
memset(c,0,sizeof(c));
printf("Case %d:\n",++ca);
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&k);
add(i,k);
}
while(scanf("%s",str)){
if(str[0]=='Q'){
scanf("%d %d",&a,&b);
printf("%d\n",sum(b)-sum(a-1));
}
else if(str[0]=='A' || str[0]=='S'){
scanf("%d%d",&a,&b);
if(str[0]=='S') b=-b;
add(a,b);
}
else break;
}
}
return 0;
}