#include<bits/stdc++.h>
using namespace std;
long long n,m,x,y,z,op,ans,yuan;
long long tree[400005],laz[400005],ll[400005],rr[400005],a[100005];
void add(long long l,long long r,long long node,long long k){
if(l<=ll[node]&&r>=rr[node]){
laz[node]+=k;
return;
}
if(l<=rr[node<<1]){
tree[node]+=(min(r,rr[node<<1])-l+1)*k;
add(l,min(r,rr[node<<1]),node<<1,k);
}
if(r>=ll[(node<<1)|1]){
tree[node]+=(r-max(ll[(node<<1)|1],l)+1)*k;
add(max(ll[(node<<1)|1],l),r,(node<<1)|1,k);
}
return;
}
void cha(long long l,long long r,long long node){
if(l<=ll[node] && r>=rr[node]){
if(laz[node]!=0){
tree[node]+=(rr[node]-ll[node]+1)*laz[node];
laz[node<<1]+=laz[node];
laz[(node<<1)|1]+=laz[node];
laz[node]=0;
}
ans+=tree[node];
return;
}
if(l<=rr[node<<1]){
if(laz[node]!=0){
tree[node]+=(rr[node]-ll[node]+1)*laz[node];
laz[node<<1]+=laz[node];
laz[(node<<1)|1]+=laz[node];
laz[node]=0;
}
cha(l,min(r,rr[node<<1]),node<<1);
}
if(r>=ll[(node<<1)|1]){
if(laz[node]!=0){
tree[node]+=(rr[node]-ll[node]+1)*laz[node];
laz[node<<1]+=laz[node];
laz[(node<<1)|1]+=laz[node];
laz[node]=0;
}
cha(max(ll[(node<<1)|1],l),r,(node<<1)|1);
}
return;
}
long long dfs(long long l,long long r,long long node){
if(l==r){
tree[node]=a[l];
ll[node]=l;
rr[node]=r;
return tree[node];
}
tree[node]=dfs(l,(l+r)/2,node<<1)+dfs((l+r)/2+1,r,(node<<1)|1);
ll[node]=l;
rr[node]=r;
return tree[node];
}
void print(){
for(long long i=1;i<=n*2;i++){
cout<<tree[i]<<" ";
}cout<<endl;
for(long long i=1;i<=n*2;i++){
cout<<laz[i]<<" ";
}cout<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cout.tie(0);
cin.tie(0);
cin>>n>>m;
for(long long i=1;i<=n;i++)
scanf("%lld",&a[i]);
dfs(1,n,1);
for(long long i=1;i<=m;i++){
cin>>op;
if(op==1){
cin>>x>>y>>z;
add(x,y,1,z);
//print();
}
else{
cin>>x>>y;
ans=0;
cha(x,y,1);
//print();
cout<<ans<<'\n';
}
}
return 0;
}