#include<bits/stdc++.h>
using namespace std;
#define maxn 1000001
unsigned long long sum[maxn << 2], add[maxn << 2], a[maxn], n, k[maxn << 2],m;
void pushup(long long rt)
{
sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}
void build(long long l, long long r, long long rt)
{
if (l == r)
{
sum[rt] = a[l];
return;
}
long long m = (l + r) >> 1;
build(l, m, rt << 1);
build(m + 1, r, rt << 1 | 1);
pushup(rt);
}
void updata(long long L, long long c, long long l, long long r, long long rt)
{
if (l == r)
{
sum[rt] += c;
return;
}
long long m = (l + r) >> 1;
if (L <= m)updata(L, c, l, m, rt << 1);
else
{
updata(L, c, m + 1, r, rt << 1 | 1);
}
pushup(rt);
}
void pushdown(long long rt, long long ln, long long rn)
{
if (add[rt])
{
add[rt << 1] += add[rt];
add[rt << 1 | 1] += add[rt];
sum[rt << 1] += add[rt] * ln;
sum[rt << 1 | 1] += add[rt] * rn;
add[rt] = 0;
}
}
void upareadata(long long L, long long R, long long c, long long l, long long r, long long rt)
{
if (L <= l && r <= R)
{
sum[rt] += c * (r - l + 1);
add[rt] += c;
return;
}
long long m = (l + r) >> 1;
pushdown(rt, m - l + 1, r - m);
if (L <= m)upareadata(L, R, c, l, m, rt << 1);
if (R > m)upareadata(L, R, c, m + 1, r, rt << 1 | 1);
pushup(rt);
}
int query(long long L, long long R, long long l, long long r, long long rt)
{
if (L <= l && r <= R) {
return sum[rt];
}
long long m = (l + r) >> 1;
pushdown(rt, m - l + 1, r - m);
long long ans = 0;
if (L <= m)ans += query(L, R, l, m, rt << 1);
if (m < R)ans += query(L, R, m + 1, r, rt << 1 | 1);
return ans;
}
int main()
{
long long type, w, b, c, z, x;
scanf("%lld%lld", &n, &m);
for (long long i = 1; i <= n; i++)
{
cin >> a[i];
}
build(1, n, 1);
while (m--)
{
scanf("%lld", &type);
switch (type)
{
case 1:
scanf("%lld%lld%lld", &w, &b, &c);
upareadata(w, b, c, 1, n, 1);
break;
case 2:
scanf("%lld%lld", &z, &x);
printf("%lld\n", query(z, x, 1, n, 1));
break;
}
}
return 0;
}