#include<iostream>
using namespace std;
const int N=100010;
long long ts[N<<2],tl[N<<2],tr[N<<2],tmid[N<<2],l_t[N<<2],a[N];
long long num(int rt){
return tr[rt]-tl[rt]+1;
}
void push_up(long long rt){
ts[rt]=ts[rt<<1]+ts[rt<<1|1];
return;
}
void push_down(long long rt){
l_t[rt<<1]+=l_t[rt];
l_t[rt<<1|1]+=l_t[rt];
ts[rt<<1]=l_t[rt]*num(rt<<1);
ts[rt<<1|1]=l_t[rt]*num(rt<<1|1);
l_t[rt]=0;
return;
}
void build(long long l,long long r,long long rt){
long long mid=(l+r)>>1;
tl[rt]=l;tr[rt]=r;tmid[rt]=mid;
if(l==r){
ts[rt]=a[l];
return;
}
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
push_up(rt);
return;
}
void add(long long l,long long r,long long k,long long rt){
if(l<=tl[rt] && tr[rt]<=r){
ts[rt]+=k*num(rt);
l_t[rt]+=k;
return;
}
push_down(rt);
if(l<=tmid[rt]){
add(l,tmid[rt],k,rt<<1);
}
if(r>tmid[rt]){
add(tmid[rt]+1,r,k,rt<<1|1);
}
}
long long query(long long l,long long r,long long rt){
if(l<=tl[rt] && tr[rt]<=r){
return ts[rt];
}
push_down(rt);
long long sum=0;
if(l<=tmid[rt]){
sum+=query(l,tmid[rt],rt<<1);
}
if(r>tmid[rt]){
sum+=query(tmid[rt]+1,r,rt<<1|1);
}
return sum;
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,n,1);
long long op,x,y,k;
while(m--){
cin>>op;
if(op==1){
cin>>x>>y>>k;
add(x,y,k,1);
}else{
cin>>x>>y;
cout<<query(x,y,1);
}
}
return 0;
}