#include #include using namespace std; using namespace atcoder; #define rep(i, n) for (int i = 0; i < (int)(n); ++i) #define int long long signed main() { int N, Q; cin >> N >> Q; vector A(N); rep(i, N) cin >> A[i]; int B = (int)(sqrtl(N) + 0.5); vector>> queries((Q + B - 1) / B); rep(q, Q) { int t; cin >> t; if (t == 1) { int x, y; cin >> x >> y; --x; queries[q / B].emplace_back(t, x, y, -1, -1); } else { int l, r, a, b; cin >> l >> r >> a >> b; --l; queries[q / B].emplace_back(t, l, r, a, b); } } for (auto& block : queries) { vector ans(block.size()); vector> events; rep(i, N) events.emplace_back(A[i], i, -1, -1, -1); rep(q, block.size()) { auto [t, l, r, a, b] = block[q]; if (t == 1) continue; events.emplace_back(a, l, r, q, 0); events.emplace_back(b, l, r, q, 1); } sort(events.begin(), events.end()); fenwick_tree sum0(N), sum1(N); for (auto [x, l, r, q, t] : events) { if (t == -1) { sum0.add(l, 1); sum1.add(l, x); } else if (t == 0) { ans[q] -= sum1.sum(l, r); ans[q] += x * sum0.sum(l, r); } else { ans[q] += sum1.sum(l, r); ans[q] += x * (r - l - sum0.sum(l, r)); } } map update_history; rep(q, block.size()) { auto [t, l, r, a, b] = block[q]; if (t == 1) { int x = l; int y = r; update_history[x] = y; } else { if (a > b) { cout << a * (r - l) << '\n'; continue; } for (auto [i, x] : update_history) { if (l <= i && i < r) { ans[q] -= clamp(A[i], a, b); ans[q] += clamp(x, a, b); } } cout << ans[q] << '\n'; } } for (auto [i, x] : update_history) { A[i] = x; } } }