Advertisement
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) {
- 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 id, int l, int r) {
- push(id, l, r);
- if (qr < l || r < ql) return;
- if (ql <= l && r <= qr) {
- seg[id] += x, d[id] += x;
- return;
- }
- int m = (l + r) >> 1;
- _(lch(id), l, m), _(rch(id), m + 1, r);
- seg[id] = seg[lch(id)] + seg[rch(id)];
- }; _(1, 0, n - 1);
- };
- auto query = [&](int ql, int qr) {
- function<long long(int, int, int)> _ = [&](int id, int l, int r) {
- push(id, l, r);
- if (qr < l || r < ql) return 0LL;
- if (ql <= l && r <= qr) return seg[id];
- int m = (l + r) >> 1;
- return _(lch(id), l, m) + _(rch(id), m + 1, r);
- }; return _(1, 0, n - 1);
- };
- for (int i = 0; i != n; i++)
- cin >> k, rmodify(i, i, k);
- for (const auto& i : seg)
- cerr << i << ' ';
- cerr << endl;
- for (const auto& i : d)
- cerr << i << ' ';
- cerr << endl;
- while (q-- && cin >> op)
- switch (op) {
- case 0:
- cin >> a >> b >> k;
- rmodify(a - 1, b - 1, k);
- break;
- case 1:
- cin >> a >> b;
- cout << query(a - 1, b - 1) << endl;
- break;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement