#include<cstdio>
using namespace std;
int const maxn = 1e6;
int n, m;
long long sum[4 * maxn + 5], input[maxn+5], add[maxn * 4 + 5];
inline void build(int k, int l, int r)
{
if(l==r)
{
sum[k] = input[l];
return;
}
int mid = (l+r)>>1;
build(k<<1,l,mid);
build((k<<1)+1,mid+1,r);
sum[k] = sum[k<<1] + sum[(k<<1)+1];
return;
}
inline void dotchange(int k, int l, int r, int x, int v)
{
if(l==r)
{
sum[k] += v;
return;
}
int mid = (l+r) >> 1;
if(x <= mid)
{
dotchange(k<<1,l,mid,x,v);
}
else
{
dotchange((k<<1)+1,mid+1,r,x,v);
}
sum[k] = sum[k<<1] + sum[(k<<1)+1];
}
inline int dotquery(int k, int l, int r, int x)
{
if(l==x)
{
return sum[k];
}
int mid = (l+1) >> 1;
if(x <= mid)
{
return dotquery(k<<1,l,mid,x);
}
else
{
return dotquery((k<<1+1),mid+1,r,x);
}
}
void Add(int k, int l, int r, int v)
{
add[k] += v;
sum[k] += (r-l+1)*v;
return;
}
void pushdown(int k, int l, int r,int mid)
{
if(add[k] == 0) return;
Add(k<<1,l,mid,add[k]);
Add((k<<1)+1,mid+1,r,add[k]);
add[k] = 0;
}
void longchange(int k, int l, int r, int x, int y, int v)
{
if(x<=l && r<=y)
{
Add(k,l,r,v);
return;
}
int mid = (l+r)>>1;
pushdown(k,l,r,mid);
if(x<=mid)
{
longchange(k<<1,l,mid,x,y,v);
}
if(y>=mid+1)
{
longchange((k<<1)+1,mid+1,r,x,y,v);
}
sum[k] = sum[k<<1] + sum[(k<<1)+1];
}
long long longquery(int k, int l, int r, int x, int y)
{
if(x<=l && r<=y)
{
return sum[k];
}
int mid = (l+r) >> 1;
pushdown(k,l,r,mid);
long long res = 0;
if(x<=mid)
{
res += longquery(k<<1,l,mid,x,y);
}
if(y>=mid+1)
{
res += longquery((k<<1)+1,mid+1,r,x,y);
}
sum[k] = sum[k<<1] + sum[(k<<1)+1];
return res;
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1;i <= n;i++)
{
scanf("%d", &input[i]);
}
build(1,1,n);
for(int q = 1;q <= m;q++)
{
int a, b, c, d;
scanf("%d", &a);
if(a == 1)
{
scanf("%d%d%d", &b,&c,&d);
longchange(1,1,n,b,c,d);
}
else
{
scanf("%d%d", &b, &c);
printf("%lld\n", longquery(1,1,n,b,c));
}
}
return 0;
}