#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 1e6;
int n,m,x,y,k,op;
ll tag[N*4],tr[N*4],a[N];
void pushup(int u)
{
tr[u] = tr[u << 1]+tr[u << 1|1];
}
void pushdown(int u,int l,int r)
{
if(tag[u])
{
int mid = (l + r) >> 1;
ll lazy = tag[u];
tag[u << 1] += lazy;
tag[u << 1|1] += lazy;
tr[u << 1] += (mid - l + 1)*lazy;
tr[u << 1|1] += (r - mid)*lazy;
tag[u] = 0;
}
}
void build(int u, int l, int r)
{
if (l == r) tr[u] = a[r];
else
{
int mid = (l + r) >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
pushup(u);
}
}
void update(int u, int l, int r, int L,int R,int d)
{
if (l >= L && r <= R)
{
tr[u] += (r-l+1)*d;
tag[u] += d;
}
else
{
pushdown(u,l,r);
int mid = (l + r) >> 1;
if (L <= mid) update(u << 1, l, mid, L, R, d);
if (R > mid) update(u << 1 | 1, mid+1, r, L, R, d);
pushup(u);
}
}
ll query(int u, int l, int r,int L,int R)
{
if (L <= l && R >= r)
{
return tr[u];
}
else
{
pushdown(u,l,r);
int mid = (l + r) >> 1;
ll res = 0;
if (L <= mid ) res += query(u << 1, l,mid, L, R);
if (R > mid) res += query(u << 1 | 1, mid+1, r, L, R);
return res;
}
}
int main()
{
cin >> n >> m;
for(int i = 1;i <= n;i++)
cin >> a[i];
build(1,1,n);
while (m -- )
{
cin >> op;
if(op == 1)
{
cin >> x >> y >> k;
update(1,1,n,x,y,k);
}
else
{
cin >> x >> y;
cout << query(1,1,n,x,y) <<endl;
}
}
return 0;
}