#include<iostream>
#include<cmath>
using namespace std;
//线段树
long long tre[100010],arr[100010],ad[100010],temp;
long long n,m,a,b,k;
inline void build(long long l,long long r,long long p){
if(l==r){
tre[p]=arr[l];
return;
}
int mid=l+((r-l)>>1);
build(l,mid,p*2);build(mid+1,r,p*2+1);
tre[p]=tre[p*2]+tre[p*2+1];
return;
}
inline void tr_add_(long long l,long long r,long long p){
if(l==r){
ad[p]+=k;return;
}
int mid=l+((r-l)>>1);
ad[p]+=k*(min(r,b)-max(l,a)+1);
if(a<=mid){
tr_add_(l,mid,p*2);
}
if(b>mid){
tr_add_(mid+1,r,p*2+1);
}
return;
}
inline long long find(long long l,long long r,long long p){
if(l==r) {return (tre[p]+ad[p]);}
int mid=l+((r-l)>>1);
long long cnt=0;
if(a<=mid){
cnt+=find(l,mid,p*2);
}
if(b>mid){
cnt+=find(mid+1,r,p*2+1);
}
return cnt;
}
int main(){
cin>>n>>m;
for(int i=1; i<=n; i++){
cin>>arr[i];
}
build(1,n,1);
for(int i=1; i<=m; i++){
cin>>temp;
if(temp==1){
cin>>a>>b>>k;
tr_add_(1,n,1);
}else{
cin>>a>>b;
cout<<find(1,n,1)<<endl;
}
}
}