【建树】
inline void build(int now,int l,int r){ int mid=(l+r)>>1; if (l==r){ sum[now]=a[l]; return; } build(now<<1,l,mid); build((now<<1)+1,mid+1,r); update(now); }
【点修改】
inline void point_change(int now,int l,int r,int x,int v){ if (l==r){ sum[now]+=v; return; } int mid=(l+r)>>1; if (x<=mid) point_change(now<<1,l,mid,x,v); else point_change((now<<1)+1,mid+1,r,x,v); update(now); }【区间修改】
inline void interval_change(int now,int l,int r,int lrange,int rrange,int v){ int mid=(l+r)>>1; if (lrange<=l&&r<=rrange){ sum[now]+=(l-r+1)*v; delta[now]+=v; return; } pushdown(now,l,r,mid); if (lrange<=mid) interval_change(now<<1,l,mid,lrange,rrange,v); if (mid+1<=rrange) interval_change(now<<1|1,mid+1,r,lrange,rrange,v); update(now); }
inline int query(int now,int l,int r,int lrange,int rrange){ int mid=(l+r)>>1,ans=0; if (lrange<=l&&r<=rrange) return sum[now]; pushdown(now,l,r,mid); if (lrange<=mid) ans+=query(now<<1,l,mid,lrange,rrange); if (mid+1<=rrange) ans+=query(now<<1|1,mid+1,r,lrange,rrange); return ans; }
inline void update(int now){ sum[now]=sum[now<<1]+sum[(now<<1)+1]; }【pushdown】
inline void pushdown(int now,int l,int r,int mid){ if (delta[now]!=0){ sum[now<<1]+=delta[now]*(mid-l+1); delta[now<<1]+=delta[now]; sum[(now<<1)+1]+=delta[now]*(r-mid); delta[(now<<1)+1]+=delta[now]; delta[now]=0; } }