#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node
{
ll l,r,add,mid,sum;
}a[400010];
void pushup(ll num)
{
a[num].sum=a[num<<1].sum+a[num<<1|1].sum;
}
void csh(ll l,ll r,ll num)
{
a[num].l=l;
a[num].r=r;
if(l==r)
{
scanf("%lld",&a[num].sum);
return ;
}
a[num].mid=l+r>>1;
csh(l,a[num].mid,num<<1);
csh(a[num].mid+1,r,num<<1|1);
pushup(num);
}
void sp(ll k)
{
a[k<<1].add+=a[k].add;
a[k<<1|1].add+=a[k].add;
a[k<<1].sum+=(a[k<<1].r-a[k<<1].l+1)*a[k].add;
a[k<<1|1].sum+=(a[k<<1].r-a[k<<1].l+1)*a[k].add;
a[k].add=0;
}
void add(ll k,ll l,ll r,ll v)
{
if(a[k].l>=l&&a[k].r<=r)
{
a[k].sum+=(a[k].r-a[k].l+1)*v;
a[k].add+=v;
return ;
}
sp(k);
if(l<=a[k].mid)
{
add(k<<1,l,r,v);
}
if(r>a[k].mid)
{
add(k<<1|1,l,r,v);
}
pushup(k);
}
ll find(ll k,ll l,ll r)
{
if(l<=a[k].l&&a[k].r<=r)
{
return a[k].sum;
}
ll ans=0;
sp(k);
if(l<=a[k].mid) ans+=find(k<<1,l,r);
if(r>a[k].mid) ans+=find(k<<1|1,l,r);
return ans;
}
int main()
{
// freopen("4.in","r",stdin);
// freopen("4.out","w",stdout);
ll n,m;
scanf("%lld%lld",&n,&m);
csh(1,n,1);
while(m--)
{
ll q;
scanf("%lld",&q);
if(q==1)
{
ll l,r,v;
scanf("%lld%lld%lld",&l,&r,&v);
add(1,l,r,v);
}
else
{
ll l,r;
scanf("%lld%lld",&l,&r);
printf("%lld\n",find(1,l,r));
}
}
}