int a[maxn]; struct Segment_Tree { #define maxn 100005 #define ls o<<1 #define rs o<<1|1 #define lss ls,l,mid #define rss rs,mid+1,r int tr[maxn<<2]; //int lch[maxn],rch[maxn]; int add[maxn]; int sum[maxn]; inline void pushdown(int o) { sum[o]=sum[ls]+sum[rs]; } inline void maintain(int o,int l,int r) { int mid=l+r>>1; sum[ls]+=(mid-l+1)*add[o]; sum[rs]+=(r-mid)*add[o]; add[ls]+=add[o]; add[rs]+=add[o]; add[o]=0; } void build(int o,int l,int r) { if(l==r) { sum[o]=a[l]; return ; } int mid=l+r>>1; build(lss); build(rss); pushdown(o); } /* int pos,val; void update(int o,int l,int r) { if(l==r) { sum[o]=val; return ; } int mid=l+r>>1; if(l<mid) update(lss); else update(rss); pushdown(o); } */ int ul,ur,uval; void update(int o,int l,int r) { if(l>=ul&&r<=ur) { sum[o]+=(r-l+1)*uval; add[o]+=uval; return ; } if(add[o]) maintain(o,l,r); int mid=l+r>>1; if(ul<mid) update(lss); if(mid<ur) update(rss); pushdown(o); } //区间查询 int ql,qr; int query(int o,int l,int r) { if(l>=ql&&r<=qr) return sum[o]; int ans=0; int mid=l+r>>1; if(ql<mid) ans+=query(lss); if(qr>mid) ans+=query(rss); return ans; } };
原文:https://www.cnblogs.com/033000-/p/10652035.html