#include<stdio.h>
#define N 100009
#define ls (p << 1)
#define rs (ls + 1)
int a[N];
int tree[N << 2], lazy[N << 2];
void build(int l, int r, int p = 1)
{
if (l == r)
{
tree[p] = a[l];
return;
}
int mid = (l + r) >> 1;
build(l, mid, ls);
build(mid + 1, r, rs);
tree[p] = tree[ls] + tree[rs];
}
void updata(int sl, int sr, int l, int r, int k, int p = 1)
{
tree[p] += (sr - sl + 1) * k;
if (l == sl && r == sr)
{
lazy[p] += k;
return;
}
int mid = (l + r) >> 1;
if (sl <= mid)
updata(sl, sr, l, mid, k, ls);
else if (sr > mid)
updata(sl, sr, mid + 1, r, k, rs);
else
updata(sl, mid, l, mid, k, ls), updata(mid + 1, sr, mid + 1, r, k, rs);
}
int query(int sl, int sr, int l, int r, int p = 1, int sum = 0)
{
if (l == sl && r == sr)
return tree[p] + (sr - sl + 1) * sum;
int mid = (l + r) >> 1;
sum += lazy[p];
if (sl <= mid)
return query(sl, sr, l, mid, ls, sum);
else if (sr > mid)
return query(sl, sr, mid + 1, r, rs, sum);
else
return query(sl, mid, l, mid, rs, sum) + query(mid + 1, sr, mid + 1, r, rs, sum);
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1;i <= n;++ i)
scanf("%d", &a[i]);
build(1, n);
int opt, l, r, x;
while (m --)
{
scanf("%d%d%d", &opt, &l, &r);
if (opt == 1)
scanf("%d", &x), updata(l, r, 1, n, x);
else
printf("%d\n", query(l, r, 1, n));
}
return 0;
}