3 solutions
-
1
#include <bits/stdc++.h> using namespace std; #define int long long #define ls(rt) rt2 #define rs(rt) rt2+1 const int N = 1e5 + 5; int n, m; int tree[N * 4], tag[N * 4], a[N];
void pushup(int rt) { tree[rt] = tree[ls(rt)] + tree[rs(rt)]; }
void build(int l, int r, int rt) { if (l == r) { tree[rt] = a[l]; return; } int mid = (l + r) / 2; build(l, mid, ls(rt)); build(mid + 1, r, rs(rt)); pushup(rt); }
void add(int l, int r, int rt, int d) { tree[rt] += (r - l + 1) * d; tag[rt] += d; }
void pushdown(int l, int r, int rt) { if (tag[rt]) { int mid = (l + r) / 2; add(l, mid, ls(rt), tag[rt]); add(mid + 1, r, rs(rt), tag[rt]); tag[rt] = 0; } }
void update(int L, int R, int rt, int l, int r, int d) { if (L <= l && r <= R) { add(l, r, rt, d); return; } pushdown(l, r, rt); int mid = (l + r) / 2; if (L <= mid) { update(L, R, ls(rt), l, mid, d); } if (R > mid) { update(L, R, rs(rt), mid + 1, r, d); } pushup(rt); }
int query(int L, int R, int rt, int l, int r) { if (L <= l && r <= R) { return tree[rt]; } pushdown(l, r, rt); int mid = (l + r) / 2, res = 0; if (L <= mid) { res += query(L, R, ls(rt), l, mid); } if (R > mid) { res += query(L, R, rs(rt), mid + 1, r); } return res; }
signed main() { cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> a[i]; } build(1, n, 1); while (m--) { int o, x, y, z; cin >> o >> x >> y; if (o == 1) { cin >> z; update(x, y, 1, 1, n, z); } else { cout << query(x, y, 1, 1, n) << endl; } } return 0; }
Information
- ID
- 6960
- Time
- 1000ms
- Memory
- 512MiB
- Difficulty
- 6
- Tags
- # Submissions
- 164
- Accepted
- 34
- Uploaded By