#include<stdio.h>
#include<string.h>
int tree[50005];
int a[50005];
int count;
void build(int node,int l,int r)
{
int mid;
if(l==r)
{
tree[node]=a[l];
return ;
}
else
{
mid=(l+r)/2;
build(node*2,l,mid);
build(node*2+1,mid+1,r);
tree[node]=tree[node*2]+tree[node*2+1];
}
}
int max(int a,int b)
{
int imax;
imax=a;
if(b>a)
imax=b;
return imax;
}
int min(int a,int b)
{
int imin;
imin=a;
if(b<a)
imin=b;
return imin;
}
void updata(int m,int n,int l,int r,int node)
{
int mid;
if(l==r)
{
a[m]+=n;
tree[node]+=n;
printf("%d\n",tree[node]);
}
else
{
mid=(l+r)/2;
if(l<=m&&m<=mid)
{
updata(m,n,l,mid,node*2);
}
else
{
updata(m,n,mid+1,r,node*2+1);
}
tree[node]=tree[node*2]+tree[node*2+1];
}
}
int query(int x,int y,int l,int r,int no)
{
if(x<=l&&y>=r)
{
return tree[no];
}
int mid=(l+r)/2;
int st,st2;
if(mid>=y)
{
return query(x,y,l,mid,no*2);
}
else if(mid<x)
return query(x,y,mid+1,r,no*2+1);
else return query(x,y,l,mid,no*2)+query(x,y,mid+1,r,no*2+1);
}
int main(void)
{
int t,j,i,m,n,zhi,x,y;
char order[20];
scanf("%d",&t);
scanf("%d",&count);
for(j=1;j<=t;j++)
{
for(i=1;i<=count;i++)
{
scanf("%d",&a[i]);
}
build(1,1,count);
printf("Case %d:\n",j);
//getchar();
while(scanf("%s",order))
{
if(strcmp(order,"End")==0)
break;
else
{
scanf("%d %d",&m,&n);
if(strcmp(order,"Query")==0)
{
printf("%d\n",query(m,n,1,count,1));
}
else if(strcmp(order,"Add")==0)
{
updata(m,n,1,count,1);
}
else if(strcmp(order,"Sub")==0)
{
updata(m,-n,1,count,1);
}
}
}
}
return 0;
}
acm算法之线段树
最新推荐文章于 2024-07-21 13:38:21 发布