#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define type long long int #define N (100000+2) using namespace std; type n,m; type edge[N<<2]; type sum[N<<2]; void change(type &x,type &y,type &v,type l=1,type r=n,type k=1){ if(r<x||y<l) return ; if(x<=l&&r<=y){ sum[k]+=v; return ; } edge[k]+=(min(r,y)-max(l,x)+1)*v; register type mid=(l+r)>>1; if(x<=mid) change(x,y,v,l,mid,k<<1); if(mid<y) change(x,y,v,mid+1,r,(k<<1)+1); return ; } type get(type &x,type &y,type l=1,type r=n,type k=1){ if(r<x||y<l) return 0; if(x<=l&&r<=y) return edge[k]+(r-l+1)*sum[k]; register type mid=(l+r)>>1; register type res=(min(r,y)-max(l,x)+1)*sum[k]; if(x<=mid) res+=get(x,y,l,mid,k<<1); if(mid<y) res+=get(x,y,mid+1,r,(k<<1)+1); return res; } int main(){ register type i,tmp,x,y,v; ios::sync_with_stdio(0); memset(edge,0,sizeof edge); memset(sum,0,sizeof sum); cin>>n>>m; for(i=1;i<=n;i++){ cin>>v; change(i,i,v); } for(i=1;i<=m;i++){ cin>>tmp>>x>>y; if(tmp==1){ cin>>v; change(x,y,v); } else if(tmp==2){ cout<<get(x,y)<<endl; } } return 0; }