建树:
int sum[N<<2],add[N<<2];
int a[N],n;
void pushup(int p)
{
sum[p]=sum[p*2]+sum[p*2+1];
}
void build(int l,int r,int p)
{
if(l==r)
{
sum[p]=a[l];
return ;
}
int mid=(l+r)/2;
build(l,mid,p*2);
build(mid+1,r,p*2+1);
pushup(p);
}
点修改:
void updatedian(int L,int c,int l,int r,int p)
{
if(l==r)
{
sum[p]+=c;
return ;
}
int mid=(l+r)/2;
if(L<=mid)
{
updatedian(L,c,l,mid,p*2);
}
else
{
updatedian(L,c,mid+1,r,p*2+1);
}
pushup(p);
}
区间修改:
void pushdown(int p,int ln,int rn)
{
if(add[p])
{
add[p*2]+=add[p];
add[p*2+1]+=add[p];
sum[p*2]+=add[p]*ln;
sum[p*2+1]+=add[p]*rn;
add[p]=0;
}
}
void updatequjian(int L,int R,int c,int l,int r,int p)
{
if(L<=l&&r<=R)
{
sum[p]+=c*(r-l+1);
add[p]+=c;
return ;
}
int mid=(l+r)/2;
pushdown(p,mid-l+1,r-mid);
if(L<=mid)
{
updatequjian(L,R,c,l,mid,p*2);
}
if(R>mid)
{
updatequjian(L,R,c,mid+1,r,p*2+1);
}
pushup(p);
}
区间查询:
int query(int L,int R,int l,int r,int p)
{
if(L<=l&&r<=R)
{
return sum[p];
}
int mid=(l+r)/2;
pushdown(p,mid-l+1,r-mid);
int ans=0;
if(L<=mid)
{
ans+=query(L,R,l,mid,p*2);
}
if(R>mid)
{
ans+=query(L,R,mid+1,r,p*2+1);
}
return ans;
}
使用:
signed main()
{
build(1,n,1);
update(L,C,1,n,1);
update(L,R,C,1,n,1);
int a=query(L,R,1,n,1);
return 0;
}