1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| #define maxn 200002 #define lson l, mid, o << 1 #define rson mid + 1, r, o << 1 | 1 struct Node { long long sum,lazy; } T[maxn<<2]; void pushup(int o) { T[o].sum=T[o<<1].sum+T[o<<1|1].sum; } void pushdown(int l,int r,int o) { int mid=(l+r)>>1; T[o<<1].sum+=T[o].lazy*(mid-l+1); T[o<<1|1].sum+=T[o].lazy*(r-mid); T[o<<1].lazy+=T[o].lazy; T[o<<1|1].lazy+=T[o].lazy; T[o].lazy=0; } void build(int l,int r,int o) { if(l==r) { scanf("%d",&T[o].sum); return; } int mid=(l+r)>>1; build(lson); build(rson); pushup(o); } void update(int L,int R,int V,int l,int r,int o) { if(l==L&&r==R) { T[o].lazy+=V; T[o].sum+=V*(r-l+1); return; } int mid=(l+r)>>1; if(T[o].lazy) pushdown(l,r,o); if(R<=mid) update(L,R,V,lson); else if(L>mid) update(L,R,V,rson); else { update(L,mid,V,lson); update(mid+1,R,V,rson); } pushup(o); } long long query(int L,int R,int l,int r,int o) { if(l==L&&R==r) return T[o].sum; int mid=(l+r)>>1; if(T[o].lazy) pushdown(l,r,o); if(R<=mid) return query(L,R,lson); else if(L>mid) return query(L,R,rson); return query(L,mid,lson)+query(mid+1,R,rson); }
|