/*
hdu1166(求区间和)
*/
#include <cstdio>
#include <cstring>
#define MAX 50000
struct node{
int l,r,num;
};
node seg_tree[3*MAX];
int n;
void ori_tree(int n,int l,int r)
{
int m=(l+r)/2;
seg_tree[n].num=0;
seg_tree[n].l=l;
seg_tree[n].r=r;
if (l!=r){
if (l<=m)
ori_tree(2*n,l,m);
if (m+1<=r)
ori_tree(2*n+1,m+1,r);
}
}
int sum(int n,int l,int r)
{
int m=(seg_tree[n].l+seg_tree[n].r)/2;
if (seg_tree[n].l==l && seg_tree[n].r==r)
return seg_tree[n].num;
else if (r<=m)
return sum(n*2,l,r);
else if (l>m)
return sum(n*2+1,l,r);
else
return sum(n*2,l,m)+sum(n*2+1,m+1,r);
}
void insert(int n,int k,int s)
{
int m=(seg_tree[n].l+seg_tree[n].r)/2;
if (seg_tree[n].l==seg_tree[n].r)
seg_tree[n].num+=s;
else if (k<=m)
{
seg_tree[n].num+=s;
insert(n*2,k,s);
}
else
{
seg_tree[n].num+=s;
insert(n*2+1,k,s);
}
}
int main(){
int i,j,t,a,b,s;
char ord[101];
scanf("%d",&t);
for (j=1;j<=t;j++)
{
scanf("%d",&n);
ori_tree(1,1,n);
for (i=1;i<=n;i++)
{
scanf("%d",&s);
insert(1,i,s);
}
printf("Case %d:\n",j);
while (scanf("%s",ord) && strcmp(ord,"End")!=0)
{
scanf("%d%d",&a,&b);
if (strcmp(ord,"Add")==0)
insert(1,a,b);
else if (strcmp(ord,"Sub")==0)
insert(1,a,-b);
else
printf("%d\n",sum(1,a,b));
}
}
return 0;
}
hdu1166(简单线段树应用,求区间和)
最新推荐文章于 2020-03-15 10:39:11 发布