线段树
参考自:https://www.cnblogs.com/AC-King/p/7789013.html
#include<stdio.h> #include<string.h> #define N 100007 int sum[N<<2],add[N<<2]; int a[N],n; void pushup(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void build(int l,int r,int rt)//建树 { if(l==r) { sum[rt]=a[l]; return ; } int mid=(l+r)>>1; build(l,mid,rt<<1); build(mid+1,r,rt<<1|1); pushup(rt); } void update(int L,int c,int l,int r,int rt)//点更新 { if(l==c) { sum[rt]+=c; return ; } int mid=(l+r)>>1; if(L<=mid) update(L,c,l,mid,rt<<1); else update(L,c,mid+1,r,rt<<1|1); pushup(rt); } void update(int L,int R,int c,int l,int r,int rt)//区间更新 { if(L<=l&&r<=R) { sum[rt]+=(r-l+1)*c; add[rt]+=c; return ; } pushdown(rt,mid-l+1,r-mid); if(L<=mid) update(L,R,c,l,mid,rt); if(R>mid) update(L,R,c,mid+1,r,rt); pushup(rt); } void pushdown(int rt,int ln,int rn) { if(add[rt]) { add[rt<<1]+=add[rt]; add[rt<<1|1]=add[rt]; sum[rt<<1]+=ln*add[rt]; sum[rt<<1|1]=rn*add[rt]; add[rt]=0; } } int query(int L,int R,int l,int r,int rt)/区间查询 { if(L<=l&&r<=R) return sum[rt]; int and=0; int mid=(l+r)>>1; pushdown(rt,mid-l+1,r-mid); if(L<=mid) and+=query(L,R,c,l,mid,rt); if(R>mid) ans+=query(L,R,c,mid+1,r,rt); return ans; } int main() { build(1,n,1); }