#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=400010;
int p[N],n,m;
struct node
{
int l=0,r=0,sum=0,lazy=0;
}a[N];
void update(int k)
{
a[k].sum=a[k*2].sum+a[k*2+1].sum;
return;
}
void build(int k,int l,int r)
{
a[k].l=l;a[k].r=r;
if(l==r)
{
a[k].sum=p[l];
return;
}
int mid=(l+r)/2;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
update(k);
}
void down(int k)
{
if(!a[k].lazy)return;
a[k*2].sum+=(a[k*2].r-a[k*2].l+1)*a[k].lazy;
a[k*2+1].sum+=(a[k*2+1].r-a[k*2+1].l+1)*a[k].lazy;
a[k*2].lazy+=a[k].lazy;
a[k*2+1].lazy+=a[k].lazy;
a[k].lazy=0;
}
void changes(int k,int l,int r,int x)
{
if(a[k].l>=l&&a[k].r<=r)
{
a[k].sum+=(a[k].r-a[k].l+1)*x;
a[k].lazy+=x;
return;
}
down(k);
int mid=(a[k].l+a[k].r)/2;
if(r>mid)
{
changes(k*2+1,l,r,x);
return;
}
if(l<=mid)
{
changes(k*2,l,r,x);
return;
}
changes(k*2,l,mid,x);
changes(k*2+1,mid+1,r,x);
update(k);
}
int query(int k,int l,int r)
{
if(a[k].l>=l&&a[k].r<=r)return a[k].sum;
down(k);
int mid=(a[k].l+a[k].r)/2,ret=0;
if(l<=mid) ret+=query(k*2,l,r);
if(r>mid) ret+=query(k*2+1,l,r);
return ret;
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)scanf("%d",&p[i]);
build(1,1,n);
while(m--)
{
int opt,x,y,k;
cin>>opt;
if(opt==1)
{
scanf("%d%d%d",&x,&y,&k);
changes(1,x,y,k);
}
if(opt==2)
{
scanf("%d%d%d",&x,&y);
printf("%d",query(1,x,y));
}
}
return 0;
}