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
| #include<iostream> #include<cstdio> using namespace std; const int maxn=1e5+10; int a[maxn+2]; struct tree{ int l,r; long long val,add; }t[4*maxn+2];
void build(int p,int l,int r){ t[p].l=l; t[p].r=r; if(l==r){ t[p].val=a[l]; return; }
int mid=l+r>>1; build(p*2,l,mid); build(p*2+1,mid+1,r); t[p].val=t[p*2].val+t[p*2+1].val; }
void spread(int p){ if(t[p].add){ t[p*2].val+=t[p].add*(t[p*2].r-t[p*2].l+1); t[p*2+1].val+=t[p].add*(t[p*2+1].r-t[p*2+1].l+1); t[p*2].add+=t[p].add; t[p*2+1].add+=t[p].add; t[p].add=0;
} }
void change(int p,int x,int y,int z){ if(x<=t[p].l && y>=t[p].r){ t[p].val+=(long long)z*(t[p].r-t[p].l+1); t[p].add+=z; return; }
spread(p); int mid=t[p].l+t[p].r>>1; if(x<=mid)change(p*2,x,y,z); if(y>mid) change(p*2+1,x,y,z); t[p].val=t[p*2].val+t[p*2+1].val; }
long long ask(int p,int x,int y){ if(x<=t[p].l && y>=t[p].r){ return t[p].val; } spread(p); int mid=t[p].l+t[p].r>>1; long long ans; if(x<=mid) ans+=ask(p*2,x,y); if(y>mid) ans+=ask(p*2+1,x,y); return ans; } int main(){ int n,m; cin>>n>>m; for(int i=1;i<=n;i++)cin>>a[i]; build(1,1,n); int q,x,y,z; for(int i=1;i<=m;i++){ scanf("%d",&q); if(q==1){ cin>>x>>y>>z; change(1,x,y,z); }else{ cin>>x>>y; cout<<ask(1,x,y)<<endl; } } return 0; }
|