Cloud clipboard
线段树模板
线段树的模板代码
struct SegTree{
struct Node{
Info sum;
Tag tag;
}t[maxn<<2];
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
#define sum(p) t[p].sum
#define tag(p) t[p].tag
void AddTag(int p,Tag k){
tag(p)=tag(p)+k;
sum(p)=sum(p)+k;
}
void PushDown(int p){
if(tag(p)==Tag()) return;
AddTag(ls(p),tag(p));
AddTag(rs(p),tag(p));
tag(p)={};
}
void PushUp(int p){
sum(p)=sum(ls(p))+sum(rs(p));
}
void Add(int p,int l,int r,int L,int R,Tag k){
if(L<=l&&R>=r) return AddTag(p,k);
if(l>R||r<L) return;
PushDown(p);
int mid=l+r>>1;
Add(ls(p),l,mid,L,R,k);
Add(rs(p),mid+1,r,L,R,k);
PushUp(p);
}
void Change(int p,int l,int r,int x,Info k){
if(l==r) return sum(p)=k,void();
PushDown(p);
int mid=l+r>>1;
if(x<=mid) Change(ls(p),l,mid,x,k);
else Change(rs(p),mid+1,r,x,k);
PushUp(p);
}
Info Query(int p,int l,int r,int L,int R){
if(L<=l&&R>=r) return sum(p);
if(l>R||r<L) return {};
PushDown(p);
int mid=l+r>>1;
return Query(ls(p),l,mid,L,R)+Query(rs(p),mid+1,r,L,R);
}
void Add(int l,int r,Tag k){
Add(1,1,n,l,r,k);
}
Info Query(int l,int r){
return Query(1,1,n,l,r);
}
void Change(int x,Info k){
Change(1,1,n,x,k);
}
void Build(int p,int l,int r){
sum(p)={},tag(p)={};
if(l==r) return sum(p)={a[l]},void();
int mid=l+r>>1;
Build(ls(p),l,mid);
Build(rs(p),mid+1,r);
PushUp(p);
}
};