您的位置:首页 > 其它

线段树 单点更新

2012-07-30 23:57 148 查看
hdu 1166 区间求和
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=50002;
int sum[maxn<<2],s[maxn],n,t;
char str[10];
void pushUp(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
return;
}
void build(int rt,int l,int r)
{
if(l==r)
{
sum[rt]=s[l];
return;
}
int mid=(l+r)>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
pushUp(rt);
}
void upDate(int rt,int l,int r,int idx,int data)
{
if(l==r)
{
sum[rt]+=data;
return;
}
int mid=(l+r)>>1;
if(mid>=idx)
upDate(rt<<1,l,mid,idx,data);
else upDate(rt<<1|1,mid+1,r,idx,data);
pushUp(rt);
}
int query(int rt,int l,int r,int L,int R)
{
if(l>=L&&r<=R)
{
return sum[rt];
}
int mid=(l+r)>>1;
int res=0;
if(mid>=L) res+=query(rt<<1,l,mid,L,R);
if(R>mid) res+=query(rt<<1|1,mid+1,r,L,R);
return res;
}
int main()
{
scanf("%d",&t);
int i,j,k,l,r,cas=1;
while(t--)
{
scanf("%d",&n);
for(i=1; i<=n; i++)scanf("%d",&s[i]);
build(1,1,n);
printf("Case %d:\n",cas++);
while(cin>>str,(str[0]!='E'))
{
if(str[0]=='A')
{
scanf("%d%d",&l,&r);
upDate(1,1,n,l,r);
}
else if(str[0]=='S')
{
scanf("%d%d",&l,&r);
upDate(1,1,n,l,-r);
}
else if(str[0]=='Q')
{
scanf("%d%d",&l,&r);
printf("%d\n",query(1,1,n,l,r));
}
}
}
return 0;
}







                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: