1 10 1 2 3 4 5 6 7 8 9 10 Query 1 3 Add 3 6 Query 2 7 Sub 10 2 Add 6 3 Query 3 10 End
Case 1: 6 33 59
#include<stdio.h>
int T,n,a,b,sum[50005<<2];
char s[10];
void pushup(int o)
{
sum[o]=sum[o<<1]+sum[o<<1|1];
}
void build(int o,int l,int r)
{
int m=(l+r)>>1;
if(l == r) scanf("%d",&sum[o]);
else {
build(o<<1 , l , m);
build(o<<1|1 , m+1,r);
pushup(o);
}
}
int query(int o,int l,int r)
{
int m=(r+l)>>1 ,res=0;
if(a<=l && r<=b) return sum[o];
else {
if(a<=m) res+=query(o<<1 , l ,m);
if(b>m) res+=query(o<<1|1 , m+1 ,r);
return res;
}
}
void update(int o,int l,int r)
{
int m=(l+r)>>1;
if(l == r) sum[o]+=b;
else {
if(a<=m) update(o<<1 , l, m);
else update(o<<1|1 , m+1 ,r);
pushup(o);
}
}
int main()
{
scanf("%d",&T);
for(int i=1;i<=T;i++) {
scanf("%d",&n);
build(1,1,n);
printf("Case %d:\n",i);
while(scanf("%s",s) && s[0]!=‘E‘) {
scanf("%d%d",&a,&b);
if(s[0] == ‘Q‘) {
printf("%d\n",query(1,1,n));
continue;
}
else if(s[0] == ‘S‘) b=-b;
update(1,1,n);
}
}
return 0;
}HDU 1166 敌兵布阵(线段树),布布扣,bubuko.com
原文:http://blog.csdn.net/u013923947/article/details/25886273