#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; }