#include #include #include #include #include template using MinHeap = std::priority_queue, std::greater>; template struct SegmentTree { using Merger = std::function; int length; std::vector dat; T unit; Merger merge; explicit SegmentTree(int n, T unit, Merger merge) : length(1), unit(unit), merge(merge) { while (length < n) length <<= 1; dat.assign(length * 2, unit); } T query(int ql, int qr) { ql = std::max(ql, 0); qr = std::min(qr, length); ql += length, qr += length; T lacc = unit, racc = unit; while (ql < qr) { if (ql & 1) { lacc = merge(lacc, dat[ql]); ++ql; } if (qr & 1) { --qr; racc = merge(dat[qr], racc); } ql >>= 1, qr >>= 1; } return merge(lacc, racc); } void update(int nidx, T elem) { nidx += length; dat[nidx] = elem; while (nidx > 0) { nidx >>= 1; T vl = dat[nidx * 2 + 0]; T vr = dat[nidx * 2 + 1]; dat[nidx] = merge(vl, vr); } } }; using lint = long long; void solve() { int n, q; std::cin >> n >> q; std::vector xs(n); for (auto& x : xs) std::cin >> x; std::vector>> adds(n); std::vector> qs; for (int t = 0; t < q; ++t) { char c; std::cin >> c; if (c == 'A') { int i; lint x; std::cin >> i >> x; --i; adds[i].emplace_back(x, t); } else { int l, r; std::cin >> l >> r; --l, --r; qs.emplace_back(l, r, t); } } std::sort(qs.begin(), qs.end()); SegmentTree seg(q, 0, [](auto a, auto b) { return a + b; }); MinHeap> heap; int qi = 0; for (int i = 0; i < n; ++i) { while (qi < (int)qs.size() && std::get<0>(qs[qi]) <= i) { int l, r, t; std::tie(l, r, t) = qs[qi]; seg.update(t, 1); ++qi; heap.emplace(r, t); } lint ans = seg.query(0, q) * xs[i]; for (auto p : adds[i]) { lint x; int t; std::tie(x, t) = p; ans += seg.query(t, q) * x; } std::cout << ans << " "; while (!heap.empty() && heap.top().first == i) { int r, t; std::tie(r, t) = heap.top(); heap.pop(); seg.update(t, 0); } } std::cout << std::endl; } int main() { std::cin.tie(nullptr); std::cout.tie(nullptr); std::ios::sync_with_stdio(false); solve(); return 0; }