#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
#define ls(p) p << 1
#define rs(p) p << 1 | 1
const int N = 1e4 + 8;
ll a[N], sum[N << 2], tot[N << 2], lz[N << 2], la[N << 2];
void build(int p, int l, int r)
{
la[p] = 1;
if(l == r)
{
sum[p] = a[l], tot[p] = a[l] * a[l];
return;
}
int m = (l + r) >> 1;
build(ls(p), l, m);
build(rs(p), m + 1, r);
sum[p] = sum[ls(p)] + sum[rs(p)];
tot[p] = tot[ls(p)] + tot[rs(p)];
}
void pushDown(int p, int pl, int pr)
{
if(la[p])
{
la[ls(p)] *= la[p];
la[rs(p)] *= la[p];
lz[ls(p)] *= la[p];
lz[rs(p)] *= la[p];
sum[ls(p)] *= la[p];
sum[rs(p)] *= la[p];
tot[ls(p)] *= la[p] * la[p];
tot[rs(p)] *= la[p] * la[p];
la[p] = 1;
}
if(lz[p])
{
int m = (pl + pr) >> 1;
tot[ls(p)] += 2 * lz[p] * sum[ls(p)] + lz[p] * lz[p] * (m - pl + 1);
tot[rs(p)] += 2 * lz[p] * sum[rs(p)] + lz[p] * lz[p] * (pr - m);
lz[ls(p)] += lz[p];
lz[rs(p)] += lz[p];
sum[ls(p)] += lz[p] * (m - pl + 1);
sum[rs(p)] += lz[p] * (pr - m);
lz[p] = 0;
}
}
void add(int p, int l, int r, int pl, int pr, ll d)
{
if(pl >= l && pr <= r)
{
lz[p] += d;
tot[p] += 2 * d * sum[p] + d * d * (pr - pl + 1);
sum[p] += d * (pr - pl + 1);
return;
}
pushDown(p, pl, pr);
int m = (pl + pr) >> 1;
if(l <= m) add(ls(p), l, r, pl, m, d);
if(r > m) add(rs(p), l, r, m + 1, pr, d);
sum[p] = sum[ls(p)] + sum[rs(p)];
tot[p] = tot[ls(p)] + tot[rs(p)];
}
void mul(int p, int l, int r, int pl, int pr, ll d)
{
if(pl >= l && pr <= r)
{
la[p] *= d;
lz[p] *= d;
sum[p] *= d;
tot[p] *= d * d;
return;
}
pushDown(p, pl, pr);
int m = (pl + pr) >> 1;
if(l <= m) mul(p, l, r, pl, m, d);
if(r > m) mul(p, l, r, m + 1, pr, d);
sum[p] = sum[ls(p)] + sum[rs(p)];
tot[p] = tot[ls(p)] + tot[rs(p)];
}
ll query1(int p, int l, int r, int pl, int pr)
{
if(pl >= l && pr <= r) return sum[p];
pushDown(p, pl, pr);
ll res = 0;
int m = (pl + pr) >> 1;
if(l <= m) res += query1(ls(p), l, r, pl, m);
if(r > m) res += query1(rs(p), l, r, m + 1, pr);
return res;
}
ll query2(int p, int l, int r, int pl, int pr)
{
if(pl >= l && pr <= r) return tot[p];
pushDown(p, pl, pr);
ll res = 0;
int m = (pl + pr) >> 1;
if(l <= m) res += query2(ls(p), l, r, pl, m);
if(r > m) res += query2(rs(p), l, r, m + 1, pr);
return res;
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) scanf("%lld", &a[i]);
build(1, 1, n);
while(m--)
{
int op, l, r;
scanf("%d%d%d", &op, &l, &r);
if(op == 1)
{
printf("%lld\n", query1(1, l, r, 1, n));
}
else if(op == 2)
{
printf("%lld\n", query2(1, l, r, 1, n));
}
else if(op == 3)
{
ll x; scanf("%lld", &x);
mul(1, l, r, 1, n, x);
}
else
{
ll x; scanf("%lld", &x);
add(1, l, r, 1, n, x);
}
}
return 0;
}