#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
long long n,m,opt,x,y,k,t;
long long L[101000],R[101000],pos[101000],sum[101000],add[101000],a[101000];
int change(long long l,long long r,long long k){
long long l_pos=pos[l];
long long r_pos=pos[r];
if(l_pos==r_pos){
for(long long i=l;i<=r;i++){
a[i]+=k;
}
sum[l_pos]=(long long)(r-l+1)*k;
}
else{
for(long long i=l_pos+1;i<=r_pos-1;i++){
add[i]+=k;
}
for(long long i=l;i<=R[l_pos];i++){
a[i]+=k;
}
sum[l_pos]=(long long)(R[l_pos]-l+1)*k;
for(long long i=L[r_pos];i<=r;i++){
a[i]+=k;
}
sum[r_pos]=(long long)(r-L[r_pos]+1)*k;
}
}
int ask(long long l,long long r){
long long ans=0;
long long l_pos=pos[l];
long long r_pos=pos[r];
if(l_pos==r_pos){
for(int i=l;i<=r;i++){
ans+=a[i];
}
ans+=add[l_pos]*(long long)(r-l+1);
}
else{
for(long long i=l_pos+1;i<=r_pos-1;i++){
ans+=sum[i]+add[i]*(long long)(R[i]-L[i]+1);
}
for(long long i=l;i<=R[l_pos];i++){
ans+=a[i];
}
ans+=add[l_pos]*(long long)(R[l_pos]-l+1);
for(long long i=L[r_pos];i<=r;i++){
ans+=a[i];
}
ans+=add[r_pos]*(long long)(r-L[r_pos]+1);
}
return ans;
}
int main(){
scanf("%lld%lld",&n,&m);
for(long long i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
t=sqrt(n);
for(long long i=1;i<=t;i++){
L[i]=(i-1)*sqrt(n)+1;
R[i]=i*sqrt(n);
}
if(R[t]<n){
t++;
L[t]=R[t-1]+1;
R[t]=n;
}
for(long long i=1;i<=t;i++){
for(int j=L[i];j<=R[i];j++){
pos[j]=i;
sum[i]+=a[j];
}
}
for(long long i=1;i<=m;i++){
scanf("%lld",&opt);
if(opt==1){
scanf("%lld%lld%lld",&x,&y,&k);
change(x,y,k);
}
else if(opt==2){
scanf("%lld%lld",&x,&y);
printf("%lld\n",ask(x,y));
}
}
return 0;
}
RT