#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using ll = long long; using Pll = pair; using Pii = pair; constexpr int INF = 1 << 30; constexpr ll LINF = 1LL << 60; constexpr ll MOD = 1000000007; constexpr long double EPS = 1e-10; constexpr int dyx[4][2] = { { 0, 1}, {-1, 0}, {0,-1}, {1, 0} }; template class SegmentTree { public: typedef function F; size_t n; vector data; T def; // 単位元 T initial_value; // 初期値 F update_func; // 更新用関数 F find_func; //クエリ用関数 SegmentTree(size_t _n, T def, T initial_value, F update_func, F find_func) : def(def), initial_value(initial_value), update_func(update_func), find_func(find_func) { n = 1; while(n < _n) n <<= 1; data = vector(2*n-1, initial_value); } void update(size_t i, T x) { i += n-1; data[i] = update_func(data[i], x); while(i) { i = (i-1) / 2; data[i] = find_func(data[2*i+1], data[2*i+2]); } } T find(size_t s, size_t t, size_t k, size_t kl, size_t kr) { if(kr <= s || t <= kl) return initial_value; if(s <= kl && kr <= t) return data[k]; size_t kc = (kl+kr) / 2; T vl = find(s, t, 2*k+1, kl, kc); T vr = find(s, t, 2*k+2, kc, kr); return find_func(vl, vr); } T find(size_t s, size_t t) { return find(s, t, 0, 0, n); } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, q; cin >> n >> q; vector a(n+1); for(int i=1;i<=n;++i) { cin >> a[i]; } vector> query(q+1, vector(3, 0)); char c; vector b(n+1, 0); { vector qb_cnt(n+1, 0); for(int i=1;i<=q;++i) { cin >> c; cin >> query[i][1] >> query[i][2]; if(c == 'B') { query[i][0] = 1; ++qb_cnt[query[i][1]]; --qb_cnt[query[i][2]+1]; } else { } } for(int i=1;i<=n;++i) qb_cnt[i] += qb_cnt[i-1]; for(int i=1;i<=n;++i) { b[i] = qb_cnt[i] * a[i]; } } { SegmentTree tree( n+3, 0LL, 0LL, [](unsigned int a, unsigned int b) { return a+b; }, [](unsigned int a, unsigned int b) { return a+b; } ); for(int i=q;i>=1;--i) { if(query[i][0] == 0) { ll cnt = tree.find(0, query[i][1]+1); b[query[i][1]] += cnt * query[i][2]; } else { tree.update(query[i][1], 1); tree.update(query[i][2]+1, -1); } } } cout << b[1]; for(int i=2;i<=n;++i) cout << " " << b[i]; cout << endl; }