傳送門:http://acm.hdu.edu.cn/showproblem.php?pid=1166
線段樹模版題
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define N 50005
using namespace std;
inline int wread(){
char c=getchar ();int flag=1,wans=0;
while (c<'0'||c>'9'){if (c=='-') flag=-1;c=getchar ();}
while (c>='0'&&c<='9'){wans=wans*10+c-'0';c=getchar ();}
return wans*=flag;
}
inline void OUT (int x){
if (x>9) OUT(x/10);
putchar (x%10+'0');
}
inline void init (){
freopen (" ","r",stdin);
freopen (" ","w",stdout);
}
int T;
int n;
struct node {int l,r,sum;}tre[N*4];
char s[40];
void make_tre (int a,int l,int r){
tre[a].l=l;tre[a].r=r;tre[a].sum=0;
if (l==r){tre[a].sum=wread();return ;}
int lson (a<<1),rson (a<<1|1),mid (l+r>>1);
make_tre (lson,l,mid);
make_tre (rson,mid+1,r);
tre[a].sum=tre[lson].sum+tre[rson].sum;
return ;
}
int fnd_ans (int a,int l,int r){
if (tre[a].l>=l && tre[a].r<=r) return tre[a].sum;
int mid (tre[a].l+tre[a].r>>1),lson (a<<1),rson (a<<1|1);
if (r<=mid) return fnd_ans (lson,l,r);
else if (l>mid) return fnd_ans (rson,l,r);
else return fnd_ans (lson,l,r)+fnd_ans (rson,l,r);
}
void add_dian (int a,int pos,int x){
if (tre[a].l==pos && tre[a].r==pos) {tre[a].sum+=x;return ;}
int mid (tre[a].l +tre[a].r >>1),lson (a<<1),rson (a<<1|1);
if (pos<=mid) add_dian (lson,pos,x);
else add_dian (rson,pos,x);
tre[a].sum=tre[lson].sum + tre[rson].sum;
}
int main (){
// init ();
T=wread();
for (int A(1);A<=T;++A){
printf("Case ");
OUT(A);
puts(":");
n=wread();
make_tre (1,1,n);
while (1){
scanf ("%s",s);
if (s[0]=='E') break;
if (s[0]=='Q'){
int st(wread()),ed(wread());
OUT(fnd_ans (1,st,ed));
putchar ('\n');
}
else if (s[0]=='A'){
int pos(wread()),x(wread());
add_dian (1,pos,x);
}
else {
int pos (wread()),x(wread());
add_dian (1,pos,-x);
}
}
}
return 0;
}