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>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>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); } };