#include using namespace std; typedef long long ll; typedef long double ld; typedef pair ii; typedef tuple iii; typedef vector vi; typedef vector vii; typedef vector viii; typedef vector vvi; typedef vector vvii; #define REP(i,n) for (ll i = 0; i < n; ++i) #define REPR(i,n) for (ll i = n-1; i >= 0; --i) #define FOR(i,m,n) for (ll i = m; i < n; ++i) #define FORR(i,m,n) for (ll i = n-1; i >= m; --i) #define FORE(x,xs) for (const auto& x : xs) #define ALL(v) v.begin(), v.end() #define CHMIN(x,y) x = min(x, y) #define CHMAX(x,y) x = max(x, y) enum QUERY_GET { SUM, MAXIMUM, MINIMUM }; template class SegmentTree { private: int ARY_SIZE; T initVal; std::vector ary; std::function merge; void init(int n, QUERY_GET qtype) { switch (qtype) { case SUM: initVal = 0; merge = [](T& l, T& r) {return l + r; }; break; case MAXIMUM: initVal = std::numeric_limits::lowest(); merge = [](T& l, T& r) {return (l > r) ? l : r; }; break; case MINIMUM: initVal = std::numeric_limits::max(); merge = [](T& l, T& r) {return (l < r) ? l : r; }; break; default: struct INVALID_QUERY_TYPE_ERROR {}; throw INVALID_QUERY_TYPE_ERROR(); break; } init(n); } void init(int n) { while (ARY_SIZE < n) ARY_SIZE <<= 1; ary.resize(ARY_SIZE << 1, initVal); } public: SegmentTree() {} SegmentTree(int n, QUERY_GET qtype) : ARY_SIZE(1) { init(n, qtype); } SegmentTree(int n, T initVal, std::function f) : ARY_SIZE(1), initVal(initVal), merge(f) { init(n); } inline void update(int i, T val) { i += ARY_SIZE; ary[i] = val; while (i > 1) { i >>= 1; ary[i] = merge(ary[i << 1], ary[(i << 1) + 1]); } } inline void add(int i, T val) { update(i, ary[i + ARY_SIZE] + val); } inline T query(int l, int r) { if (l >= r) return initVal; T vl = initVal, vr = initVal; for (l += ARY_SIZE, r += ARY_SIZE; l != r; l >>= 1, r >>= 1) { if (l & 1) vl = merge(vl, ary[l++]); if (r & 1) vr = merge(ary[--r], vr); } return merge(vl, vr); } T operator[](int i) { return ary[i + ARY_SIZE]; } void debugShow() { for (int i = ARY_SIZE; i < ARY_SIZE << 1; ++i) std::cerr << ary[i] << " "; std::cerr << "\n"; } }; const int MAX = 2e5+10; int N, Q, A[MAX], X[MAX], Y[MAX]; bool C[MAX]; vi solve() { SegmentTree cnt(N+10, SUM); vi b(N); REPR (q, Q) { if (C[q]) { b[X[q]] += 1ll * cnt.query(0, X[q]+1) * Y[q]; } else { cnt.add(X[q], 1); cnt.add(Y[q]+1, -1); } } REP (i, N) { b[i] += 1ll * cnt.query(0, i+1) * A[i]; } return b; } int main() { cin >> N >> Q; REP (i, N) cin >> A[i]; REP (q, Q) { char c; cin >> c >> X[q] >> Y[q]; C[q] = (c == 'A'); X[q]--; if (!C[q]) Y[q]--; } vi ans = solve(); REP (i, N) { cout << ans[i]; cout << (i==N-1 ? '\n' : ' '); } }