#include<bits/stdc++.h>
using namespace std;
int n,m;
const int maxn=1e7;
int a[500010];
int ans=0;
struct lintr
{
struct node{
int l,r,sum,lz;
}tr[maxn];
void push_down(int p)
{
if(tr[p].lz!=0)
{
tr[p*2].lz+=tr[p].lz;
tr[p*2+1].lz+=tr[p].lz;
int mid=(tr[p].l+tr[p].r)>>1;
tr[p*2].sum+=tr[p].lz*(mid-tr[p*2].l+1);
tr[p*2+1].sum+=tr[p].lz*(tr[p*2+1].r-mid);
tr[p].lz=0;
}
return;
}
void build(int p,int l,int r)
{
tr[p]={l,r,0};
if(l==r)
{
tr[p].sum=a[l];
return;
}
int mid=(l+r)>>1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
tr[p].sum=tr[p*2].sum+tr[p*2+1].sum;
}
void search(int p,int l,int r)
{
if(tr[p].l>=l&&tr[p].r<=r)
{
ans+=tr[p].sum;
return;
}
push_down(p);
int mid=(tr[p].l+tr[p].r)>>1;
if(l<=mid)search(p*2,l,r);
if(mid<r)search(p*2+1,l,r);
}
void add(int p,int l,int r,int k)
{
if(tr[p].l==tr[p].r)
{
tr[p].sum+=k*(tr[p].r-tr[p].l+1);
tr[p].lz+=k;
return;
}
push_down(p);
int mid=(tr[p].l+tr[p].r)>>1;
if(mid>=l)
{
add(p*2,l,r,k);
}
if(mid<r)
{
add(p*2+1,l,r,k);
}
tr[p].sum=tr[p*2].sum+tr[p*2+1].sum;
return ;
}
}st;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
st.build(1,1,n);
for(int i=1;i<=m;i++)
{
int x,c,d,f;
cin>>x;
if(x==1)
{
cin>>c>>d>>f;
st.add(1,c,d,f);
}
else
{
cin>>c>>d;
ans=0;
st.search(1,c,d);
printf("%d\n",ans);
}
}
}