#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+5;
struct tree{
int l,r;
ll date,ad;
}t[4*maxn];
ll a[maxn],f;
int n,m;
int op,p,q;
void b(int x,int y,int s){
t[s].l=x;
t[s].r=y;
if(x==y){
t[s].date=a[x];
return;
}
int mid=(x+y)>>1;
b(x,mid,2*s);
b(mid+1,y,2*s+1);
t[s].date=t[s*2].date+t[s*2+1].date;
return;
}
void bj(int s){
if(t[s].ad){
t[s].date+=t[s].ad*(t[s].r-t[s].l+1);
t[s*2].ad+=t[s].ad;
t[s*2+1].ad+=t[s].ad;
t[s].ad=0;
}
return;
}
void add(int x,int y,int s,ll k){
if(x<=t[s].l&&t[s].r<=y){
t[s].date+=(k*(t[s].r-t[s].l+1));
t[s].ad+=k;
return;
}
bj(s);
int mid=(t[s].l+t[s].r)>>1;
if(x<=mid) add(x,mid,s*2,k);
if(y>mid) add(mid+1,y,s*2+1,k);
t[s].date=t[s*2].date+t[s*2+1].date;
return;
}
ll get(int x,int y,int s){
bj(s);
if(x<=t[s].l&&t[s].r<=y) return t[s].date;
int mid=(t[s].l+t[s].r)>>1;
ll ans=0;
if(x<=mid) ans+=get(x,mid,s*2);
if(mid<y) ans+=get(mid+1,y,s*2+1);
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
b(1,n,1);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&op,&q,&p);
if(op==1){
scanf("%lld",&f);
add(q,p,1,f);
}else printf("%lld\n",get(q,p,1));
}
return 0;
}