#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define for(a,b,c) for(int a=b;a<=c;a++)
const int N=4e5+50,M=1e5+50;
long long tree[N],a[M];
int tl[N],tr[N],tmid[N],lazy[N];
void maketree(int x,int l,int r);
void pushdown (int x);
void Replace (int x);
long long Find(int x,int l,int r);
void maketree(int x,int l,int r)//当前x 左l 右r
{
tr[x]=r;
tl[x]=l;
lazy[x]=0;
if(l==r)
{
tree[x]=a[l];
}
else
{
int mid=(l+r)/2;
tmid[x]=mid;
maketree(x*2,l,mid);
maketree(x*2+1,mid+1,r);
Replace(x);
}
}
void pushdown (int x)
{
if(tl[x]<tr[x])
{
if(tl[x*2]<=tr[x*2])
{
tree[x*2]+=(tr[x*2]-tl[x*2]+1)*lazy[x];
lazy[x*2]+=lazy[x];
}
if(tl[x*2+1]<=tr[x*2+1])
{
tree[x*2+1]+=(tr[x*2+1]-tl[x*2+1])*lazy[x];
lazy[x*2+1]+=lazy[x];
}
Replace(x);
}
lazy[x]=0;
}
void Replace (int x)
{
tree[x]=tree[x*2]+tree[x*2+1];
}
void add(int x,int l,int r,long long k)
{
if(tr[x]==r && tl[x]==l)
{
tree[x]+=(r-l+1)*k;
lazy[x]+=k;
return;
}
pushdown(x);
if(r<=tmid[x])
{
add(x<<1,l,r,k);
}
else if(l>tmid[x])
{
add(x*2+1,l,r,k);
}
else
{
add(x<<1,l,tmid[x],k);
add(x*2+1,tmid[x]+1,r,k);
}
Replace(x);
}
long long Find(int x,int l,int r)
{
if(tr[x]==r && tl[x]==l)
{
return tree[x];
}
else if(r<=tmid[x])
{
return Find(x*2,l,r);
}
else if(l>tmid[x])
{
return Find(x*2+1,l,r);
}
else
{
return Find(x*2,l,tmid[x])+Find(x*2+1,tmid[x]+1,r);
}
}
int main()
{
int n,m;
cin>>n>>m;
for(i,1,n)
cin>>a[i];
maketree(1,1,n);
for(i,1,m)
{
int opt;
cin>>opt;
if(opt==1)
{
int a,b,k;
cin>>a>>b>>k;
add(1,a,b,k);
}
if(opt==2)
{
int a,b;
cin>>a>>b;
long long res=Find(1,a,b);
cout<<res<<endl;
}
}
return 0;
}