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 61 62 63 64 65 66 67 68 69 70 71 72 73
| #include <bits/stdc++.h> using namespace std; const int N=100010; typedef long long ll; int n,m; #define lc (p<<1) #define rc (p<<1|1) ll w[N]; struct node{ ll l,r,sum,add; }t[N*4]; void build(int p,int l,int r){ t[p]={l,r,w[l],0}; if(l==r) return; int m=(l+r)>>1; build(lc,l,m); build(rc,m+1,r); t[p].sum=t[lc].sum+t[rc].sum; return; } void pushup(int p){ t[p].sum=t[rc].sum+t[lc].sum; } void pushdown(int p){ if(t[p].add){ t[rc].sum+=t[p].add*(t[rc].r-t[rc].l+1); t[lc].sum+=t[p].add*(t[lc].r-t[lc].l+1); t[lc].add+=t[p].add; t[rc].add+=t[p].add; t[p].add=0; } } void update(int p,int x,int y,ll k){ if(x<=t[p].l&&t[p].r<=y){ t[p].sum+=(t[p].r-t[p].l+1)*k; t[p].add+=k; return; } int m=(t[p].l+t[p].r)>>1; pushdown(p); if(x<=m) update(lc,x,y,k); if(y>m) update(rc,x,y,k); pushup(p); } ll query(int p,int x,int y){ if(x<=t[p].l&&t[p].r<=y) return t[p].sum; int m=(t[p].l+t[p].r)>>1; ll sum=0; pushdown(p); if(x<=m) sum+=query(lc,x,y); if(y>m) sum+=query(rc,x,y); return sum; } int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m; for(int i=1;i<=n;i++) cin>>w[i]; build(1,1,n); while(m--){ int op,x,y,k; cin>>op>>x>>y; if(op==1){ cin>>k; update(1,x,y,k); }else{ cout<<query(1,x,y)<<'\n'; } } return 0; }
|