RT
#include<iostream>
using namespace std;
int n,m,a[1000009],op,x,y,k;
struct tree
{
int l,r;
int sum,num;
}t[4000009];
void update(int x)
{
t[x].sum=t[x<<2].sum+t[x<<2|1].sum;
}
void down(int x)
{
t[x<<2].num+=t[x].num;
t[x<<2|1].num+=t[x].num;
t[x<<2].sum+=t[x].num*(t[x<<2].r-t[x<<2].l+1);
t[x<<2|1].sum+=t[x].num*(t[x<<2|1].r-t[x<<2|1].l+1);
t[x].num=0;
}
void build(int x,int l,int r)
{
t[x].l=l;
t[x].r=r;
if (l==r)
{
t[x].sum=a[l];
return;
}
int mid=(l+r)>>1;
build(x<<2,l,mid);
build(x<<2|1,mid+1,r);
update(x);
}
void insert(int x,int l,int r,int k)
{
if (t[x].l>r||t[x].r<l)return;
if (t[x].l>=l&&t[x].r<=r)
{
t[x].num+=k;
t[x].sum+=(t[x].r-t[x].l+1)*k;
return;
}
down(x);
insert(x<<2,l,r,k);
insert(x<<2|1,l,r,k);
// update(x);
// down(x);
t[x].sum=t[x<<2].sum+t[x<<2|1].sum;
/* t[x].sum+=(t[x].r-t[x].l+1)*t[x].num;*/
}
int find(int x,int l,int r)
{
if (t[x].l>r||t[x].r<l)return 0;
if (t[x].l>=l||t[x].r<=r)
{
return t[x].sum;
}
down(x);
return find(x<<2,l,r)+find(x<<2|1,l,r);
}
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++)
{
cin>>op;
if (op==1)
{
cin>>x>>y>>k;
insert(1,x,y,k);
}
if (op==2)
{
cin>>x>>y;
cout<<find(1,x,y)<<endl;
}
}
return 0;
}