线段树

long long sum[maxn*4],lazy[maxn*4];
long long a[maxn];
void PushUp(long long rt){sum[rt]=sum[rt<<1]+sum[rt<<1|1];}//重置当前节点(rt)的信息
void PushDown(long long rt,long long ln,long long rn){
if(lazy[rt]){
lazy[rt<<1]+=lazy[rt];sum[rt<<1]+=lazy[rt]*ln;

lazy[rt<<1|1]+=lazy[rt];sum[rt<<1|1]+=lazy[rt]*rn;
lazy[rt]=0;
}
}
void Build(long long l,long long r, long long rt){
if(l==r){sum[rt]=a[l];return;}
long long m=(l+r)>>1;
Build(l,m,rt<<1);
Build(m+1,r,rt<<1|1);
PushUp(rt);
}
void Update(long long L,long long R,long long C,long long l,long long r,long long rt){
if(L<=l&&r<=R){
sum[rt]+=C*(r-l+1);
lazy[rt]+=C;
return;
}
long long m=(l+r)>>1;
PushDown(rt,m-l+1,r-m);
if(L <= m)Update(L,R,C,l,m,rt<<1);
if(R > m)Update(L,R,C,m+1,r,rt<<1|1);
PushUp(rt);
}
long long Query(long long L,long long R,long long l,long long r,long long rt){
if(L<=l&&r<=R){
return sum[rt];
}
long long m=(l+r)>>1;
PushDown(rt,m-l+1,r-m);
long long ANS=0;
if(L <= m)ANS+=Query(L,R,l,m,rt<<1);
if(R > m )ANS+=Query(L,R,m+1,r,rt<<1|1);
return ANS;
}
posted @ 2020-10-13 14:40  yesuweiYYYY  阅读(101)  评论(0编辑  收藏  举报