更新线段,并查询线段。
http://poj.org/problem?id=3468
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
#define maxn 1000020
__int64 sum[4*maxn];
__int64 col[4*maxn];
void Pushup(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void buildtree(int l,int r,int rt)
{
col[rt]=0;
if(l==r)
{
scanf("%I64d",&sum[rt]);
return ;
}
int mid=(l+r)/2;
buildtree(l,mid,rt<<1);
buildtree(mid+1,r,rt<<1|1);
Pushup(rt);
}
void Pushdown(int m,int rt)
{
if(col[rt])
{
col[rt<<1]+=col[rt];
col[rt<<1|1]+=col[rt];
sum[rt<<1]+=col[rt]*(m-(m>>1));
sum[rt<<1|1]+=col[rt]*(m>>1);
col[rt]=0;
}
}
void Update(int L,int R,int c,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
col[rt]+=c;
sum[rt]+=c*(r-l+1);
return ;
}
Pushdown(r-l+1,rt);
int mid=(l+r)/2;
if(L<=mid) Update(L,R,c,l,mid,rt<<1);
if(R>mid) Update(L,R,c,mid+1,r,rt<<1|1);
Pushup(rt);
}
__int64 Query(int L,int R,int l,int r,int rt)
{
__int64 ret=0;
if(L<=l&&r<=R)
return sum[rt];
Pushdown(r-l+1,rt);
int mid=(l+r)>>1;
if(L<=mid) ret+=Query(L,R,l,mid,rt<<1);
if(R>mid) ret+=Query(L,R,mid+1,r,rt<<1|1);
return ret;
}
int main()
{
int n,m;
char str;
long long ans;
scanf("%d%d",&n,&m);
buildtree(1,n,1);
while(m--)
{
cin>>str;
int a,b,c;
if(str=='Q')
{
scanf("%d%d",&a,&b);
ans=Query(a,b,1,n,1);
printf("%I64d\n",ans);
}
else if(str=='C')
{
scanf("%d%d%d",&a,&b,&c);
Update(a,b,c,1,n,1);
}
}
return 0;
}
更新点,查询线段。
http://acm.nyist.net/JudgeOnline/problem.php?pid=116
#include<stdio.h>
#include<string.h>
#define maxn 4100002
int ans;
int sum[maxn];
void Pushup(int rt) //将子节点的数据传给根节点。
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void buildtree(int left,int right,int rt) //创建树的同时更新到根节点,结构体中sum保存。
{
if(left==right)
{
scanf("%d",&sum[rt]);
return ;
}
int mid=(left+right)/2;
buildtree(left,mid,rt<<1);
buildtree(mid+1,right,rt<<1|1);
Pushup(rt);
}
void query(int left,int right,int rt,int L,int R)
{
if(L<=left&&right<=R)
{
ans+=sum[rt];
return;
}
int mid=(left+right)/2;
if(R<=mid)
query(left,mid,rt<<1,L,R);
else if(L>mid)
query(mid+1,right,rt<<1|1,L,R);
else
{
query(left,mid,rt<<1,L,R);
query(mid+1,right,rt<<1|1,L,R);
}
}
void update(int left,int right,int rt,int pos,int add)
{
if(left==right)
{
sum[rt]+=add;
return;
}
int mid=(left+right)/2;
if(pos<=mid)
update(left,mid,rt<<1,pos,add);
else
update(mid+1,right,rt<<1|1,pos,add);
Pushup(rt);//更新到上层节点。
}
int main()
{
int n,k;
int a,b;
char str[10];
scanf("%d%d",&n,&k);
buildtree(1,n,1);
while(k--)
{
scanf("%s",str);
scanf("%d%d",&a,&b);
if(strcmp(str,"QUERY")==0)
{
ans=0;
query(1,n,1,a,b);
printf("%d\n",ans);
}
else if(strcmp(str,"ADD")==0)
update(1,n,1,a,b);
}
return 0;
}