#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long u64;
typedef pair<int, int> PII;
const int N = 1e5 + 10;
const int mod = 1e9 + 7;
int n, m;
LL a[N];
struct info
{
LL sum, tag;
};
struct node
{
info val;
} seg[N * 4];
void update(int id)
{
seg[id].val.sum = seg[id * 2].val.sum + seg[id * 2 + 1].val.sum;
}
void build(int id, int l, int r)
{
if (l == r) seg[id].val = {a[l], 0};
else
{
int mid = (l + r) / 2;
build(id * 2, l, mid);
build(id * 2 + 1, mid + 1, r);
update(id);
}
}
void settag(int id, LL t, int len)
{
seg[id].val.sum += (t * (LL) len);
seg[id].val.tag += t;
}
void pushdown(int id, int l, int r)
{
if (seg[id].val.tag != 0)
{
int mid = (l + r) / 2;
settag(id * 2, seg[id].val.tag, mid - l + 1);
settag(id * 2 + 1, seg[id].val.tag, r - mid);
seg[id].val.tag = 0;
}
}
void modify(int id, int l, int r, int ql, int qr, LL t)
{
if (l == ql && r == qr)
{
settag(id, t, r - l + 1);
return;
}
pushdown(id, l, r);
int mid = (l + r) / 2;
if (qr <= mid) modify(id * 2, l, mid, ql, qr, t);
else if (ql > mid) modify(id * 2 + 1, mid + 1, r, ql, qr, t);
else
{
modify(id * 2, l, mid, ql, mid, t);
modify(id * 2 + 1, mid + 1, r, mid + 1, qr, t);
}
update(id);
}
LL query(int id, int l, int r, int ql, int qr)
{
if (l == r) return seg[id].val.sum;
pushdown(id, l, r);
int mid = (l + r) / 2;
if (qr <= mid) return query(id * 2, l, mid, ql, qr);
else if (ql > mid) return query(id * 2 + 1, mid + 1, r, ql, qr);
else
{
return (query(id * 2, l, mid, ql, mid)
+ query(id * 2 + 1, mid + 1, r, mid + 1, qr));
}
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
{
scanf("%lld", &a[i]);
}
build(1, 1, n);
while (m--)
{
int op;
scanf("%d", &op);
if (op == 1)
{
int x, y, k;
scanf("%d%d%d", &x, &y, &k);
modify(1, 1, n, x, y, k);
} else
{
int x, y;
scanf("%d%d", &x, &y);
printf("%lld\n", query(1, 1, n, x, y));
}
}
return 0;
}