#include<bits/stdc++.h>
#define N 2000010
using namespace std;
int read()
{
int x = 0,f = 1;
char c = getchar();
while(c<'0' || c>'9')
{
if(c=='-') f = -1;
c = getchar();
}
while(c>='0' && c<='9')
{
x = (x<<3)+(x<<1)+(c^48);
c = getchar();
}
return x*f;
}
int a[N],z[N],t[N];
void build(int p,int l,int r)
{
t[p] = 0;
if (l==r)
{
z[p] = a[l];
return;
}
int mid = (r+l)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
z[p] = z[p<<1]+z[p<<1|1];
}
void update(int x,int y,int l,int r,int k,int p)
{
if (x<=l && y>=r)
{
z[p] += k*(r-l+1);
t[p] += k;
return;
}
int mid = (l+r)>>1;
t[p<<1] += t[p];
z[p<<1] += t[p]*(mid-l+1);
t[p<<1|1] += t[p];
z[p<<1|1] += t[p]*(r-mid-1);
t[p] = 0;
if (x<=mid) update(x,y,l,mid,k,p<<1);
if (y>mid) update(x,y,mid+1,r,k,p<<1|1);
z[p] = z[p<<1]+z[p<<1|1];
}
int query(int x,int y,int l,int r,int p)
{
int ans = 0;
if (x<=l && y>=r) return z[p];
int mid = (l+r)>>1;
t[p<<1] += t[p];
z[p<<1] += t[p]*(mid-l+1);
t[p<<1|1] += t[p];
z[p<<1|1] += t[p]*(r-mid-1);
t[p] = 0;
if (x<=mid) ans += query(x,y,l,mid,p<<1);
if (y>mid) ans += query(x,y,mid+1,r,p<<1|1);
return ans;
}
int main()
{
int n=read(),k=read();
for (int i=1;i<=n;i++)
a[i]=read();
build(1,1,n);
while(k--)
{
if (read()==1)
{
int x=read(),y=read(),k=read();
update(x,y,1,n,k,1);
}
else
{
int x=read(),y=read();
cout << query(x,y,1,n,1) << endl;
}
}
return 0;
}
记录