#include<bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
#define il inline
const int MAXN=1e5+5;
using namespace std;
ll opt;
ll n,m,x,y,k;
ll a[MAXN],ans[MAXN<<2],lazy[MAXN<<2];
il ll lc(int x){
return x<<1;
}
il ll rc(int x){
return x<<1|1;
}
void push_down(ll rt,ll ln,ll rn){
if(lazy[rt]){
lazy[lc(rt)]+=lazy[rt];
lazy[rc(rt)]+=lazy[rt];
ans[lc(rt)]+=lazy[rt]*ln;
ans[rc(rt)]+=lazy[rt]*rn;
}
lazy[rt]=0;
}
void push_up(ll rt){
ans[rt]=ans[lc(rt)]+ans[rc(rt)];
}
void build(ll l,ll r,ll rt){
lazy[rt]=0;
if(l==r){
ans[rt]=a[l];
return;
}
ll m=(l+r)>>1;
build(lc(rt),l,m);
build(rc(rt),m+1,r);
push_up(rt);
}
void update(ll L,ll R,ll l,ll r,ll v,ll rt){
if(L<=l&&r<=R){
ans[rt]+=v*(r-l+1);
lazy[rt]+=v;
return;
}
push_down(rt,m-l+1,r-m);
ll m=(l+r)>>1;
if(L<=m)
update(L,R,l,m,v,lc(rt));
if(R>m)
update(L,R,m+1,r,v,rc(rt));
push_up(rt);
}
ll query(ll L,ll R,ll l,ll r,ll rt){
if(L<=l&&r<=R){
return ans[rt];
}
ll m=(l+r)>>1;
push_down(rt,m-l+1,r-m);
ll Ans=0;
if(L<=m)
Ans+=query(L,R,l,m,lc(rt));
if(R>m)
Ans+=query(L,R,m+1,r,rc(rt));
return Ans;
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build(1,1,n);
for(ll i=1;i<=m;i++){
scanf("%lld",&opt);
switch(opt){
case 1:{
scanf("%lld%lld%lld",&x,&y,&k);
update(x,y,1,n,k,1);
break;
}
case 2:{
scanf("%lld%lld",&x,&y);
printf("%lld\n",query(x,y,1,n,1));
break;
}
}
}
return 0;
}