rt
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m;
ll p,x,y,k;
struct node{
ll l,r;
ll sum;
ll lazy;
}a[300000];
ll xx[300000];
ll build(ll l,ll r,ll k)
{
a[k].l=l,a[k].r=r;
if(l==r)
{
a[k].sum=xx[l];
return xx[l];
}
ll mid=(l+r)>>1;
a[k].sum+=build(l,mid,k*2);
a[k].sum+=build(mid+1,r,k*2+1);
return a[k].sum;
}
ll add(ll l,ll r,ll x,ll k)
{
if(l==a[k].l&&r==a[k].r)
{
a[k].lazy+=x;
return (r-l+1)*x;
}
ll mid=(a[k].l+a[k].r)>>1;
if(mid>=r)
{
ll s=add(l,r,x,k*2);
a[k].sum+=s;
return s;
}
if(l>mid)
{
ll s=add(l,r,x,k*2+1);
a[k].sum+=s;
return s;
}
ll sa=add(l,mid,x,k*2),sb=add(mid+1,r,x,k*2+1);
a[k].sum+=(sa+sb);
return sa+sb;
}
ll sum(ll l,ll r,ll k,ll la)
{
a[k].sum+=(a[k].r-a[k].l+1)*(la+a[k].lazy);
la+=a[k].lazy,a[k].lazy=0;
if(l==a[k].l&&r==a[k].r) return a[k].sum;
ll mid=(a[k].l+a[k].r)>>1;
if(mid>=r)
return sum(l,r,k*2,la);
if(l>mid)
return sum(l,r,k*2+1,la);
return sum(l,mid,k*2,la)+sum(mid+1,r,k*2+1,la);
}
int main()
{
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++) scanf("%lld",&xx[i]);
build(1,n,1);
for(ll i=1;i<=m;i++)
{
scanf("%lld",&p);
if(p==1)
{
scanf("%lld%lld%lld",&x,&y,&k);
add(x,y,k,1);
}
else
{
scanf("%lld%lld",&x,&y);
printf("%lld\n",sum(x,y,1,0));
}
}
return 0;
}