Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define int long long
- const int INF = 1e18 + 7;
- const int MAXN = 1e6 + 10;
- array<int, 4 * MAXN> tree, sum, a;
- array<int, 4 * MAXN> add;
- void build(int x, int lx, int rx) {
- if (rx - lx == 1) {
- tree[x] = a[lx] * (lx + 1);
- sum[x] = a[lx];
- return;
- }
- int m = (lx + rx) / 2;
- build(2 * x + 1, lx, m);
- build(2 * x + 2, m, rx);
- tree[x] = tree[2 * x + 1] + tree[2 * x + 2];
- sum[x] = sum[2 * x + 1] + sum[2 * x + 2];
- }
- void push(int x, int lx, int rx) {
- sum[x] += (rx - lx) * add[x];
- tree[x] += add[x] * (lx + 1 + rx) * (rx - lx) / 2;
- if (rx - lx != 1) {
- add[2 * x + 1] += add[x];
- add[2 * x + 2] += add[x];
- }
- add[x] = 0;
- }
- void update(int x, int lx, int rx, int l, int r, int v) {
- push(x, lx, rx);
- if (lx >= r || rx <= l) {
- return;
- }
- if (lx >= l && rx <= r) {
- add[x] += v;
- push(x, lx, rx);
- return;
- }
- int m = (lx + rx) / 2;
- update(2 * x + 1, lx, m, l, r, v);
- update(2 * x + 2, m, rx, l, r, v);
- tree[x] = tree[2 * x + 1] + tree[2 * x + 2];
- sum[x] = sum[2 * x + 1] + sum[2 * x + 2];
- }
- int get(int x, int lx, int rx, int l, int r) {
- push(x, lx, rx);
- if (lx >= r || rx <= l) {
- return 0;
- }
- if (lx >= l && rx <= r) {
- return tree[x] - sum[x] * l;
- }
- int m = (lx + rx) / 2;
- return get(2 * x + 1, lx, m, l, r) + get(2 * x + 2, m, rx, l, r);
- }
- signed main() {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- int n, m;
- cin >> n >> m;
- for (int i = 0; i < n; ++i) {
- cin >> a[i];
- }
- build(0, 0, n);
- for (int i = 0; i < m; ++i) {
- int t;
- cin >> t;
- if (t == 1) {
- int l, r, d;
- cin >> l >> r >> d;
- --l;
- update(0, 0, n, l, r, d);
- } else {
- int l, r;
- cin >> l >> r;
- --l;
- cout << get(0, 0, n, l, r) << '\n';
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment