1 #include<algorithm>
2 #include<cstdio>
3 using namespace std;
4 typedef long long ll;
5 const ll N=1e5+10,INF=0x3f3f3f3f;
6 ll n,m;
7 ll sum[N],t[N<<2],tag[N<<2],ans[N<<2];
8 inline ll ls(ll p){return p<<1;}
9 inline ll rs(ll p){return p<<1|1;}
10 inline void push_up(ll p){ans[p]=ans[ls(p)]+ans[rs(p)];}
11 inline void add(ll l,ll r,ll p,ll k){ans[p]+=k*(r-l+1);tag[p]+=k;}
12 inline ll read(){
13 ll x=0,f=1;char ch=getchar();
14 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
15 while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
16 return x*f;
17 }
18 inline void scan(){
19 n=read();m=read();
20 for(ll i=1;i<=n;i++)sum[i]=read();
21 }
22 void build(ll p,ll l,ll r){
23 if(l==r){
24 ans[p]=sum[l];return;
25 }
26 ll mid=(l+r)>>1;
27 build(ls(p),l,mid);
28 build(rs(p),mid+1,r);
29 push_up(p);
30 }
31 void push_down(ll l,ll r,ll p){
32 ll mid=(l+r)>>1;
33 add(l,mid,ls(p),tag[p]);
34 add(mid+1,r,rs(p),tag[p]);
35 tag[p]=0;
36 }
37 void update(ll cl,ll cr,ll l,ll r,ll p,ll k){
38 if(cl<=l&&cr>=r){
39 add(l,r,p,k);return;
40 }
41 ll mid=(l+r)>>1;
42 push_down(l,r,p);
43 if(cl<=mid)update(cl,cr,l,mid,ls(p),k);
44 if(cr>mid)update(cl,cr,mid+1,r,rs(p),k);
45 push_up(p);
46 }
47 ll query(ll cl,ll cr,ll l,ll r,ll p){
48 ll res=0;
49 if(cl<=l&&cr>=r)return ans[p];
50 ll mid=(l+r)>>1;
51 push_down(l,r,p);
52 if(cl<=mid)res+=query(cl,cr,l,mid,ls(p));
53 if(cr>mid)res+=query(cl,cr,mid+1,r,rs(p));
54 return res;
55 }
56 int main(){
57 // freopen("testdata.in","r",stdin);
58 // freopen("testdata.out","w",stdout);
59 scan();
60 build(1,1,n);
61 while(m--){
62 ll k=read();
63 if(k==1){
64 ll l=read(),r=read(),k=read();
65 update(l,r,1,n,1,k);
66 }
67 else {
68 ll l=read(),r=read();
69 printf("%lld\n",query(l,r,1,n,1));
70 }
71 }
72 return 0;
73 }