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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| #include<bits/stdc++.h> #define int long long using namespace std;
const int LEN=1e5+5; struct Node { int sum,tag; }tr[LEN*4];
int n,m; int a[LEN];
void pushup(int u) { tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum; return; }
void apply(int u,int l,int r,int v) { tr[u].sum+=v*(r-l+1); tr[u].tag+=v; return; }
void pushdown(int u,int l,int r) { if(tr[u].tag) { int mid=(l+r)>>1; apply(u<<1,l,mid,tr[u].tag); apply(u<<1|1,mid+1,r,tr[u].tag); tr[u].tag=0; } return; }
void build(int u,int l,int r) { tr[u].tag=0; if(l==r) { tr[u].sum=a[l]; return; } int mid=(l+r)>>1; build(u<<1,l,mid); build(u<<1|1,mid+1,r); pushup(u); return; }
void update(int u,int l,int r,int L,int R,int v) { if(L<=l&&r<=R) { apply(u,l,r,v); return; } pushdown(u,l,r); int mid=(l+r)>>1; if(L<=mid) update(u<<1,l,mid,L,R,v); if(mid<R) update(u<<1|1,mid+1,r,L,R,v); pushup(u); return; }
int query(int u,int l,int r,int L,int R) { if(L<=l&&r<=R) return tr[u].sum; pushdown(u,l,r); int mid=(l+r)>>1; int ans=0; if(L<=mid) ans+=query(u<<1,l,mid,L,R); if(mid<R) ans+=query(u<<1|1,mid+1,r,L,R); return ans; }
signed main() { cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; build(1,1,n);
while(m--) { int op,x,y; cin>>op>>x>>y; if(op==1) { int k; cin>>k; update(1,1,n,x,y,k); } else cout<<query(1,1,n,x,y)<<endl; } return 0; }
|