Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #define IO ios::sync_with_stdio(0);cin.tie(0)
- #define MAXN 100005
- using namespace std;
- struct ST {
- long long val, tag;
- };
- int N, Q;
- int in[MAXN];
- int a, b, c;
- char type;
- ST st[MAXN << 2];
- void build(int, int, int);
- int query(int, int, int, int, int);
- void push(int, int, int);
- void modify(int, int, int, int, int, int);
- signed main()
- {
- IO;
- cin >> N >> Q;
- for (int i = 1; i <= N; i++)
- cin >> in[i];
- build(1, N, 1);
- while (Q--) {
- cin.ignore();
- cin >> type;
- if (type == 'Q') {
- cin >> a >> b;
- cout << query(1, N, a, b, 1) << endl;
- }
- else {
- cin >> a >> b >> c;
- modify(1, N, a, b, 1, c);
- }
- }
- return 0;
- }
- void build(int l, int r, int id)
- {
- if (l == r) {
- st[id].val = in[l];
- return;
- }
- int m = (l + r) >> 1;
- build(l, m, id << 1);
- build(m + 1, r, id << 1 | 1);
- st[id].val = st[id << 1].val + st[id << 1 | 1].val;
- }
- int query(int l, int r, int L, int R, int id)
- {
- if (st[id].tag)
- push(l, r, id);
- if (L <= l && r <= R)
- return st[id].val;
- if (r < L || R < l)
- return 0;
- int m = (l + r) >> 1;
- return query(l, m, L, R, id << 1) + query(m + 1, r, L, R, id << 1 | 1);
- }
- void push(int l, int r, int id)
- {
- st[id].val += (r - l + 1) * st[id].tag;
- st[id << 1].tag += st[id].tag;
- st[id << 1 | 1].tag += st[id].tag;
- st[id].tag = 0;
- }
- void modify(int l, int r, int L, int R, int id, int val)
- {
- if (L <= l && r <= R) {
- st[id].tag += val;
- return;
- }
- if (r < L || R < l)
- return;
- int m = (l + r) >> 1;
- modify(l, m, L, R, id << 1, val);
- modify(m + 1, r, L, R, id << 1 | 1, val);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement