#include<bits/stdc++.h>
using namespace std;
#define int long long
struct tree{
int l,r,w,lazy;
};
int n,m;
vector<int>a;
vector<tree>tr;
void update(int k)
{
tr[k].w=tr[k*2].w+tr[k*2+1].w;
}
void push_down(int k)
{
if(tr[k].l==tr[k].r)
{
tr[k].lazy=0;
return;
}
tr[k*2].w+= (tr[k*2].r-tr[k*2].l+1)*tr[k].lazy;
tr[k*2+1].w+= (tr[k*2+1].r-tr[k*2+1].l+1)*tr[k].lazy;
tr[k*2].lazy+=tr[k].lazy;
tr[k*2+1].lazy+=tr[k].lazy;
tr[k].lazy=0;
}
void build(int p,int x,int y)
{
tr[p].l=x;
tr[p].r=y;
if(x==y)
{
tr[p].w=a[x];
return ;
}
int mid=(x+y)/2;
build(p*2,x,mid);
build(p*2+1,mid+1,y);
update(p);
}
void change(int p,int x,int y,int z)
{
if(tr[p].l==x &&tr[p].r==y)
{
tr[p].w+=(y-x+1)*z;
tr[p].lazy+=z;
return ;
}
int mid=(tr[p].l+tr[p].r)/2;
if(y<=mid)
{
change(p*2,x,y,z);
}
else if(x>mid)
{
change(p*2+1,x,y,z);
}
else{
change(p*2,x,mid,z);
change(p*2+1,mid+1,y,z);
}
update(p);
}
int quary(int p,int x,int y)
{
if(tr[p].lazy)push_down(p);
if(tr[p].l==x &&tr[p].r==y)
{
return tr[p].w;
}
int mid=(tr[p].l+tr[p].r)/2;
if(mid>=y)
{
return quary(p*2,x,y);
}
else if(mid<x)
{
return quary(p*2+1,x,y);
}
return quary(p*2,x,mid)+quary(p*2+1,mid+1,y);
}
signed main()
{
cin>>n>>m;
a.resize(n+1);
tr.resize(n*4+5);
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
build(1,1,n);
for(int i=0;i<m;i++)
{
int a,x,y,k;
cin>>a>>x>>y;
if(a==1)
{
cin>>k;
change(1,x,y,k);
}
else{
cout<<quary(1,x,y)<<endl;
}
}
}