#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+5;
int n,m,A[N];
struct Node
{
int l,r;
ll sum,lz;
}T[N*8];
void pushup(int rt)
{
T[rt].sum=T[rt<<1].sum+T[rt<<1|1].sum;
}
void pushdown(int rt)
{
ll lzz=T[rt].lz;
if(lzz>0)
{
T[rt<<1].lz+=lzz;
T[rt<<1|1].lz+=lzz;
T[rt<<1].sum+=(T[rt<<1].r-T[rt<<1].l+1)*lzz;
T[rt<<1|1].sum+=(T[rt<<1|1].r-T[rt<<1|1].l+1)*lzz;
T[rt].lz=0;
}
}
void build(int rt,int l,int r)
{
T[rt]={l,r,0,0};
if(l==r)
{
T[rt].sum=A[l];
return ;
}
int mid=l+r>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
pushup(rt);
}
void modify(int rt,int l,int r,int k)
{
if(T[rt].l>=l && T[rt].r<=r)
{
T[rt].lz+=k;
T[rt].sum+=(T[rt].r-T[rt].l+1)*k;
return ;
}
pushdown(rt);
int mid=T[rt].l+T[rt].r>>1;
if(mid>=l) modify(rt<<1,l,r,k);
if(mid<r) modify(rt<<1|1,l,r,k);
pushup(rt);
}
ll query(int rt,int l,int r)
{
if(T[rt].l>=l && T[rt].r<=r)
return T[rt].sum;
pushdown(rt);
ll s=0;
int mid=T[rt].l+T[rt].r>>1;
if(mid>=l) s+=(rt<<1,l,r);
if(mid<r) s+=(rt<<1|1,l,r);
return s;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>A[i];
}
build(1,1,n);
for(int i=1;i<=m;i++)
{
int op,x,y,k;
cin>>op;
if(op==1)
{
cin>>x>>y>>k;
modify(1,x,y,k);
}
else
{
cin>>x>>y;
cout<<query(1,x,y)<<endl;
}
}
return 0;
}