#include using namespace std; using ll = long long; using pii = pair; using pll = pair; using vi = vector; using vl = vector; #define rep3(i, a, b, c) for (ll i = (a); i < (b); i += (c)) #define rep2(i, a, b) rep3(i, a, b, 1) #define rep1(i, n) rep2(i, 0, n) #define rep0(n) rep1(aaaaa, n) #define ov4(a, b, c, d, name, ...) name #define rep(...) ov4(__VA_ARGS__, rep3, rep2, rep1, rep0)(__VA_ARGS__) #define per(i, a, b) for (ll i = (a) - 1; i >= (b); i--) #define fore(e, v) for (auto &&e : v) #define all(a) begin(a), end(a) #define sz(a) (int)(size(a)) #define lb(v, x) (lower_bound(all(v), x) - begin(v)) #define eb emplace_back template bool chmin(T &a, const S &b) { return a > b ? a = b, 1 : 0; } template bool chmax(T &a, const S &b) { return a < b ? a = b, 1 : 0; } const int INF = 1e9 + 100; const ll INFL = 3e18 + 100; #define i128 __int128_t struct _ { _() { cin.tie(0)->sync_with_stdio(0), cout.tie(0); } } __; template struct dynamic_segtree { static_assert(std::is_convertible_v>, "op must work as S(S, S)"); static_assert(std::is_convertible_v>, "e must work as S()"); static const ll K = 62; static const ll segsize = 1ll << K; dynamic_segtree() : root(), N(0) {}; S get(ll p) { return _get(p); } S prod(ll l, ll r) { return _prod(root, l, r); } void set(ll p, S val) { return _set(root, p, val); } size_t size() { return N; } private: struct node; using node_ptr = node *; struct node { S val; node_ptr left, right; node() : val(e()), left(nullptr), right(nullptr) {} }; node_ptr root; ll N; S _prod(node_ptr &nd, ll l, ll r, ll btm = 0, ll top = segsize) { if (!nd) return e(); if (r <= btm || top <= l) return e(); if (l <= btm && top <= r) return nd->val; ll mid = (btm + top) / 2; return op(nd->left ? _prod(nd->left, l, r, btm, mid) : e(), nd->right ? _prod(nd->right, l, r, mid, top) : e()); } S _get(ll p) { node_ptr nd = root; per(i, K, 0) { if (!nd) return e(); if (p >> i & 1) nd = nd->right; else nd = nd->left; } if (!nd) return e(); return nd->val; } void _set(node_ptr &nd, ll p, S val, ll btm = 0, ll top = segsize) { if (p + 1 <= btm || top <= p) return; if (!nd) { nd = new node(); if (btm + 1 == top) N++; } if (p <= btm && top <= p + 1) { nd->val = val; return; } ll mid = (btm + top) / 2; _set(nd->left, p, val, btm, mid); _set(nd->right, p, val, mid, top); nd->val = op((nd->left ? nd->left->val : e()), (nd->right ? nd->right->val : e())); } }; ll seg_op(ll a, ll b) { return a + b; } ll seg_e() { return 0ll; } int main() { int N, Q; cin >> N >> Q; const int segsize = 1 << 17; vector> superseg(segsize * 2), supercnt(segsize * 2); auto supersum = [](ll l, ll r, ll segl, ll segr, vector> &seg) -> ll { l += segsize, r += segsize; ll ret = 0; while (l < r) { if (l % 2) { ret += seg[l].prod(segl, segr); l++; } if (r % 2) { --r; ret += seg[r].prod(segl, segr); } l /= 2, r /= 2; } return ret; }; auto superadd = [](ll p, ll segp, ll diff, vector> &seg) { p += segsize; while (p > 0) { seg[p].set(segp, seg[p].get(segp) + diff); p /= 2; } }; vi A(N); rep(i, N) cin >> A[i]; rep(i, N) { superadd(i, A[i], A[i], superseg); superadd(i, A[i], 1, supercnt); } while (Q--) { int op; cin >> op; if (op == 1) { int X, Y; cin >> X >> Y; --X; superadd(X, A[X], -A[X], superseg); superadd(X, A[X], -1, supercnt); A[X] = Y; superadd(X, A[X], A[X], superseg); superadd(X, A[X], 1, supercnt); } else { int L, R, A, B; cin >> L >> R >> A >> B; --L; cout << supersum(L, R, A, B, superseg) + supersum(L, R, 0, A, supercnt) * A + supersum(L, R, B, (int)1e9, supercnt) * B << '\n'; } } }