1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| #include <bits/stdc++.h> #define mid (start + end) / 2 #define lc node * 2 #define rc node * 2 + 1 using namespace std; typedef long long ll;
const int maxn = 100005; ll tree[maxn * 4], lazy[maxn * 4]; vector<ll> ls; ll n, m, choice;
void push(ll node, ll start, ll end) { if (lazy[node] != 0) { tree[node] += lazy[node] * (end - start + 1); if (start != end) { lazy[lc] += lazy[node]; lazy[rc] += lazy[node]; } lazy[node] = 0; } }
void build(ll node, ll start, ll end) { if (start == end) tree[node] = ls[start]; else { build(lc, start, mid); build(rc, mid + 1, end); tree[node] = tree[lc] + tree[rc]; } }
void add(ll node, ll start, ll end, ll l, ll r, ll k) { push(node, start, end); if (start > r || end < l) return; if (l <= start && end <= r) { lazy[node] += k; push(node, start, end); return; } add(lc, start, mid, l, r, k); add(rc, mid + 1, end, l, r, k); tree[node] = tree[lc] + tree[rc]; }
ll sum(ll node, ll start, ll end, ll l, ll r) { if (start > r || end < l) return 0; push(node, start, end); if (l <= start && end <= r) return tree[node]; ll la = sum(lc, start, mid, l, r); ll ra = sum(rc, mid + 1, end, l, r); return la + ra; }
int main() { cin >> n >> m; ls.assign(n + 1, 0); for (int i = 1; i <= n; i++) cin >> ls[i]; build(1, 1, n);
ll x, y, k; for (int i = 0; i < m; i++) { cin >> choice; if (choice == 1) { cin >> x >> y >> k; add(1, 1, n, x, y, k); } else { cin >> x >> y; cout << sum(1, 1, n, x, y) << '\n'; } } return 0; }
|