1.定义:
const int maxn=400040;
int n,a[maxn],lazy[maxn],ans[maxn];
2.更新:
inline void push_up(int root){
ans[root]=ans[root<<1]+ans[root<<1|1];
}
3.下传懒标记:
inline void push_down(int root,int ln,int rn){
if(lazy[root]){
lazy[root<<1]+=lazy[root];
lazy[root<<1|1]+=lazy[root];
ans[root<<1]+=lazy[root]*ln;
ans[root<<1|1]+=lazy[root]*rn;
lazy[root]=0;
}
}
4.pos位置增加C
inline void Add(int pos,int C,int l,int r,int root){
if(l==r){
ans[root]+=C;
return;
}
int mid=(l+r)>>1;
if(pos<=mid)
Add(pos,C,l,mid,root<<1);
else
Add(pos,C,mid+1,r,root<<1|1);
push_up(root);
}
5.L到R区间增加C
inline void Update(int L,int R,int C,int l,int r,int root){
if(L<=l&&R>=r){
ans[root]+=C*(r-l+1);
lazy[root]+=C;
return;
}
int mid=(l+r)>>1;
push_down(root,mid-l+1,r-mid);
if(L<=mid) Update(L,R,C,l,mid,root<<1);
if(R>mid) Update(L,R,C,mid+1,r,root<<1|1);
push_up(root);
}
6.建树
inline void build(int l,int r,int root){
if(l==r){
ans[root]=a[l];
return;
}
int mid=(l+r)>>1;
build(l,mid,root<<1);
build(mid+1,r,root<<1|1);
push_up(root);
}
7.查询L到R和
inline ll Query(int L,int R,int l,int r,int root){
if(L<=l&&R>=r)
return ans[root];
int mid=(l+r)>>1;
push_down(root,mid-l+1,r-mid);
ll ANS=0;
if(L<=mid) ANS+=Query(L,R,l,mid,root<<1);
if(R>mid) ANS+=Query(L,R,mid+1,r,root<<1|1);
return ANS;
}