#include<stdio.h>
#define maxn 50005
struct Tree{
int left,right,sum;
}tr[maxn*3];
int array[maxn];
void build(int l,int r,int now)
{
tr[now].left=l; tr[now].right=r;
if(l==r)
{
tr[now].sum=array[l];
return;
}
int mid=(l+r)/2;
build(l,mid,now*2);
build(mid+1,r,(now*2)+1);
tr[now].sum=tr[now*2].sum+tr[now*2+1].sum;
}
void update(int now,int goal,int add)
{
if(tr[now].left==tr[now].right)
{ tr[now].sum+=add; return ;}
int mid=(tr[now].left+tr[now].right)/2;
if(goal<=mid)
{
update(now*2,goal,add);
}
else
update(now*2+1,goal,add);
tr[now].sum=tr[now*2].sum+tr[now*2+1].sum;
}
int query(int start,int end,int now)
{
if(start<=tr[now].left && tr[now].right<=end)
{ return tr[now].sum;}
int ans=0;
int mid=(tr[now].left+tr[now].right)/2;
if(start<=mid)
{
ans+=query(start,end,now*2);
}
if(end>mid)
ans+=query(start,end,now*2+1);
return ans;
}
int main()
{
int t,i,j,k,n,a,b,p,number;
char str[10];
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
scanf("%d",&t);
for(k=1;k<=t;k++)
{
printf("Case %d:\n",k);
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&array[i]);
build(1,n,1);
//for(i=1;i<=n*3;i++)
// printf("%d %d %d\n",tr[i].left,tr[i].right,tr[i].sum);
// printf("\n................\n");
while(scanf("%s",str))
{
if(str[0]=='E')
break;
if(str[0]=='Q')
{
scanf("%d %d",&a,&b);
printf("%d\n",query(a,b,1));
}
if(str[0]=='A')
{
scanf("%d %d",&p,&number);
update(1,p,number);
}
if(str[0]=='S')
{
scanf("%d %d",&p,&number);
update(1,p,-number);
}
}
}
}
再次复习线段树,主要是改善风格和完善代码。
#include <stdio.h>
#include <string.h>
#define maxn 50050
#define lson l , m , rt*2
#define rson m+1 , r , rt*2+1
int n;
int sum[maxn<<2];
int in[maxn];
void PushUp(int rt){
sum[rt] = sum[rt*2] + sum[rt*2+1];
}
void build(int l, int r, int rt)
{
if(l == r) {
sum[rt] = in[l];
return ;
}
int m = (l + r) / 2;
build(lson);
build(rson);
PushUp(rt);
}
int query(int L,int R,int l,int r,int rt)
{
if(L <= l && r <= R)
return sum[rt];
int m = (l + r) / 2;
int ret = 0;
if(L <= m) ret += query(L,R,lson);
if(R > m) ret += query(L,R,rson);
return ret;
}
void update(int index,int add,int l,int r,int rt)
{
if(l == r){
sum[rt] += add;
return ;
}
int m = (l + r) / 2;
if(index <= m) update(index ,add ,lson);
else update(index ,add , rson);
PushUp(rt);
}
int main()
{
int T,i,cas=1;
char op[10];
scanf("%d",&T);
while(T--)
{
printf("Case %d:\n",cas++);
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&in[i]);
getchar();
build(1,n,1);
while(scanf("%s",op))
{
if(op[0]=='E')
break;
int a,b;
scanf("%d%d",&a,&b);
if(op[0]=='Q') printf("%d\n",query(a,b,1,n,1));
else if(op[0] == 'S') update(a,-b,1,n,1);
else update(a,b,1,n,1);
}
}
}