#include<cstdio>
#define N 100003
#define ll long long
using namespace std;
struct tree
{
int l,r;
ll sum;
ll lztag;
}t[N*4];
int n,m;
ll a[N];
void pushdown(int p)
{
if(t[p].lztag && t[p].l != t[p].r)
{
int lson = p*2, rson = p*2+1;
t[lson].lztag += t[p].lztag;
t[rson].lztag += t[p].lztag;
t[lson].sum += t[p].lztag * (t[lson].r - t[lson].l + 1);
t[rson].sum += t[p].lztag * (t[rson].r - t[rson].l + 1);
t[p].lztag = 0;
}
return ;
}
void build(int l,int r,int p)
{
t[p].l = l, t[p].r = r, t[p].lztag = 0;
if(l == r)
{
t[p].sum = a[l];
return;
}
int mid = (l + r) / 2;
build(l, mid, 2*p);
build(mid+1, r, 2*p+1);
t[p].sum = t[2*p].sum + t[2*p+1].sum;
return ;
}
void modify(int l,int r,int p,int v)
{
if(l <= t[p].l && t[p].r <= r)
{
t[p].sum += (ll)v * (t[p].r - t[p].l + 1);
t[p].lztag += v;
return;
}
pushdown(p);
int mid = (t[p].l + t[p].r) / 2;
if(r <= mid) modify(l, r, 2*p, v);
else if(l > mid) modify(l, r, 2*p+1, v);
else {
modify(l, mid, 2*p, v);
modify(mid+1, r, 2*p+1, v);
}
t[p].sum = t[2*p].sum + t[2*p+1].sum;
return ;
}
ll query(int l,int r,int p)
{
if(l <= t[p].l && t[p].r <= r)
return t[p].sum;
pushdown(p);
int mid = (t[p].l + t[p].r) / 2;
if(r <= mid) return query(l, r, 2*p);
if(l > mid) return query(l, r, 2*p+1);
return query(l, mid, 2*p) + query(mid+1, r, 2*p+1);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,n,1);
for(int i=1;i<=m;i++)
{
int op;
scanf("%d",&op);
if(op==1)
{
int lp,rp,k;
scanf("%d%d%d",&lp,&rp,&k);
modify(lp,rp,1,k);
}
else if(op==2)
{
int lp,rp;
scanf("%d%d",&lp,&rp);
ll v=query(lp,rp,1);
printf("%lld\n",v);
}
}
return 0;
}