Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<vector>
- #include<algorithm>
- #include<functional>
- #define endl '\n'
- using namespace std;
- int main() {
- cin.tie(nullptr);
- ios::sync_with_stdio(false);
- int n, q, op, a, b, k;
- cin >> n >> q;
- vector<long long> seg(n << 2, 0LL), d(n << 2, 0LL);
- auto lch = [](int x) {return x << 1 ;};
- auto rch = [](int x) {return x << 1 | 1;};
- auto push = [&](int i, int l, int r) {
- if (!d[i]) return;
- seg[i] += d[i] * (r - l + 1);
- d[lch(i)] += d[i], d[rch(i)] += d[i];
- d[i] = 0;
- };
- auto rmodify = [&](int ql, int qr, long long x) {
- function<void(int, int, int)> _ = [&](int i, int l, int r) {
- push(i, l, r);
- if (qr < l || r < ql) return;
- if (ql <= l && r <= qr) {
- d[i] += x, push(i, l, r);
- return;
- }
- int m = (l + r) >> 1;
- _(lch(i), l, m), _(rch(i), m + 1, r);
- seg[i] = seg[lch(i)] + seg[rch(i)];
- }; _(1, 1, n);
- };
- auto query = [&](int ql, int qr) {
- function<long long(int, int, int)> _ = [&](int i, int l, int r) {
- push(i, l, r);
- if (qr < l || r < ql) return 0LL;
- if (ql <= l && r <= qr) return seg[i];
- int m = (l + r) >> 1;
- return _(lch(i), l, m) + _(rch(i), m + 1, r);
- }; return _(1, 1, n);
- };
- for (int i = 1; i <= n; i++)
- cin >> k, rmodify(i, i, k);
- while (q-- && cin >> op)
- switch (op) {
- case 0:
- cin >> a >> b >> k;
- rmodify(a, b, k);
- break;
- case 1:
- cin >> a >> b;
- cout << query(a, b) << endl;
- break;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment