#include<bits/stdc++.h>
using namespace std;
const long long N=1e6+10;
long long a[N],tr[N],lazy[N];
void push_up(long long rt)
{
tr[rt]=tr[rt*2]+tr[rt*2+1];
}
void push_down(long long rt,long long l,long long r)
{
if(lazy[rt]==0)return;
long long mid=l+r>>1;
lazy[rt*2]+=lazy[rt];
lazy[rt*2+1]+=lazy[rt];
lazy[rt*2]+=lazy[rt]*(mid-l+1);
lazy[rt*2+1]+=lazy[rt]*(r-mid);
lazy[rt]=0;
}
void bd(long long rt,long long l,long long r)
{
lazy[rt]=0;
if(l==r)
{
tr[rt]=a[l];
return;
}
long long mid=l+r>>1;
bd(rt*2,l,mid);
bd(rt*2+1,mid+1,r);
push_up(rt);
}
long long find(long long rt,long long l,long long r,long long ql,long long qr)
{
if(ql<=l&&r<=qr)
{
return tr[rt];
}
long long mid=l+r>>1;
push_down(rt,l,r);
if(qr<=mid)return find(rt*2,l,mid,ql,qr);
if(ql>mid)return find(rt*2+1,mid+1,r,ql,qr);
return find(rt*2,l,mid,ql,qr)+find(rt*2+1,mid+1,r,ql,qr);
}
void update(long long rt,long long l,long long r,long long ql,long long qr,long long k)
{
if(ql<=l&&r<=qr)
{
lazy[rt]+=k;
tr[rt]+=k*(r-l+1);
return;
}
long long mid=l+r>>1;
push_down(rt,l,r);
if(ql<=mid)update(rt*2,l,mid,ql,qr,k);
if(qr>mid)update(rt*2+1,mid+1,r,ql,qr,k);
push_up(rt);
}
int main()
{
long long n,m;
cin>>n>>m;
for(long long i=1;i<=n;i++)
cin>>a[i];
bd(1,1,n);
for(long long i=1;i<=m;i++)
{
long long op;
cin>>op;
if(op==1)
{
long long l,r,k;
cin>>l>>r>>k;
update(1,1,n,l,r,k);
}
else
{
long long l,r;
cin>>l>>r;
cout<<find(1,1,n,l,r)<<'\n';
}
}
return 0;
}