线段树体现了一种分治的思想——将分治思想理解好,线段树就比较好写。
/*
* hdu-1166
* mike-w
* 2012-4-8
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_SIZE 666666
#define MAX_N 55555
#define BUF_SIZE 50
typedef struct _tnode
{
int l,r,sum;
}tnode;
tnode tree[MAX_SIZE];
int N,T;
int f[MAX_N];
int idc;
int build_tree(int rt,int l,int r)
{
if(l==r)
{
tree[rt].l=tree[rt].r=l;
return tree[rt].sum=f[idc++];
}
else
{
tree[rt].l=l;
tree[rt].r=r;
int mid=(l+r)/2;
return tree[rt].sum=
build_tree(rt*2,l,mid)+build_tree(rt*2+1,mid+1,r);
}
}
int query(int rt, int x1, int x2)
{
if(tree[rt].l==x1 && tree[rt].r==x2)
return tree[rt].sum;
int mid=(tree[rt].l+tree[rt].r)/2;
if(x2<=mid)
return query(rt*2,x1,x2);
else if(x1>mid)
return query(rt*2+1,x1,x2);
else
return query(rt*2,x1,mid)+query(rt*2+1,mid+1,x2);
}
int add(int rt, int x, int inc)
{
if(tree[rt].l==x && tree[rt].r==x)
{
tree[rt].sum+=inc;
return 0;
}
int mid=(tree[rt].l+tree[rt].r)/2;
tree[rt].sum+=inc;
if(x<=mid)
add(rt*2,x,inc);
else if(x>mid)
add(rt*2+1,x,inc);
return 0;
}
#ifdef LIST
int list(void)
{
puts("listing daata...");
int i;
for(i=1;i<=N;i++)
printf("%d ",query(1,i,i));
putchar('\n');
return 0;
}
#endif
int main(void)
{
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
#endif
int ccase,i,x1,x2,c;
char buf[BUF_SIZE];
scanf("%d",&T);
for(ccase=1;ccase<=T;ccase++)
{
scanf("%d",&N);
for(i=1;i<=N;i++)
scanf("%d",f+i);
idc=1;
build_tree(1,1,N);
printf("Case %d:\n",ccase);
while(scanf("%s",buf),buf[0]!='E')
{
if(buf[0]=='Q')
{
scanf("%d%d",&x1,&x2);
printf("%d\n",query(1,x1,x2));
}
else
{
scanf("%d%d",&x1,&c);
if(buf[0]=='S') c=-c;
add(1,x1,c);
#ifdef LIST
list();
#endif
}
}
}
return 0;
}