题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1166
//线段树 单点更新
#include <cstdio>
#include <algorithm>
using namespace std;
#define N 50010
int segtree[N*4+10];
int in[N];
void build_tree(int root, int l, int r){
if (l==r){
segtree[root] = in[l];
}else{
int mid = (l+r)>>1;
build_tree(root*2,l,mid);
build_tree(root*2+1,mid+1,r);
segtree[root] = segtree[root*2] + segtree[root*2+1];
}
}
int query_tree(int root , int l , int r, int ll, int rr){
// printf("l=%d r=%d %d\n",l,r,segtree[root]);
if (l>rr || r< ll)
return -1;
if (l>=ll&&r<=rr){
return segtree[root];
}
int mid = (l+r)>>1;
int p1 =query_tree(root*2,l,mid,ll,rr);
int p2= query_tree(root*2+1,mid+1,r,ll,rr);
if (p1==-1)
return p2;
if (p2==-1)
return p1;
return p1+p2;
}
int update_tree(int root,int l ,int r , int pos , int v){
if (pos<l || pos> r)
return 1;
if (l==r){
segtree[root]+=v;
}else{
int mid = (l+r)>>1;
if (pos<=mid)
update_tree(root*2,l,mid,pos,v);
else
update_tree(root*2+1,mid+1,r,pos,v);
segtree[root] = segtree[root*2]+segtree[root*2+1];
}
}
int main (){
int n;
int t ;
scanf("%d",&t);
for (int i = 1 ; i <= t ; i++){
printf("Case %d:\n",i);
scanf("%d",&n);
for (int j = 1 ; j <= n ; j++){
scanf("%d",&in[j]);
}
build_tree(1,1,n);
char s[10];
int a,b;
for (;;){
scanf("%s",s);
if (s[0]=='Q'){
scanf("%d%d",&a,&b);
printf("%d\n",query_tree(1,1,n,a,b));
}else if(s[0] == 'A'){
scanf("%d%d",&a,&b);
update_tree(1,1,n,a,b);
}else if (s[0] == 'S'){
scanf("%d%d",&a,&b);
update_tree(1,1,n,a,-b);
}else{
break;
}
}
}
return 0;
}