# include<bits/stdc++.h>
using namespace std;
const int N=4e5+10;
#define ll long long
ll a[N];int n,m;
ll d[N];ll b[N];
void push_up(int p)
{
d[p]=d[p<<1]+d[p<<1|1];
}
void push_down(int l,int r,int p)
{
int mid=(l+r)>>1;
if(b[p])
{
d[p<<1]+=b[p]*(mid-l+1);d[p<<1|1]+=b[p]*(r-mid);
b[p<<1]+=b[p];b[p<<1|1]+=b[p];
b[p]=0;
}
}
void build(int l,int r,int p)
{
if(l==r){
d[p]=a[l];
return;
}
int mid=(l+r)>>1;
build(l,mid,p<<1);
build(mid+1,r,p<<1|1);
push_up(p);
}//建树
void Change(int l,int r,int s,int t,int c,int p)
{
if(l<=s&&r>=t){
d[p]+=(t-s+1)*c;b[p]+=c;
return;
}
push_down(s,t,p);
int mid=(s+t)>>1;
if(l<=mid)
Change(l,r,s,mid,c,p<<1);
if(r>mid)
Change(l,r,mid+1,t,c,p<<1|1);
push_up(p);
}//线段树区间修改
ll get_sum(int l,int r,int s,int t,int p)
{
ll ans=0;
if(l<=s&&r>=t){
return d[p];
}
push_down(s,t,p);
int mid=(s+t)>>1;
if(l<=mid)
ans+=get_sum(l,r,s,mid,p<<1);
if(r>mid)
ans+=get_sum(l,r,mid+1,t,p<<1|1);
push_up(p);
return ans;
}//区间求和
int main()
{
cin>>n>>m;
for(int i=1;i<=n;++i)
cin>>a[i];
build(1,n,1);
while(m--)
{
int s;cin>>s;int x,y,k;
if(s==1){
cin>>x>>y>>k;
Change(x,y,1,n,k,1);
}
else{
cin>>x>>y;
cout<<get_sum(x,y,1,n,1)<<endl;
}
}
return 0;
}