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
| #include <bits/stdc++.h> using namespace std;
const int N = 1e5+10; typedef long long ll; ll tr[N * 4], lazytag[N * 4]; int a[N], n, m; #define ls k*2 #define rs k*2+1 void build(int k, int l, int r) { if (l == r) tr[k] = a[l]; else { int mid = l + r >> 1; build(ls, l, mid); build(rs, mid + 1, r); tr[k] = tr[ls] + tr[rs]; } } void change(int k, int l, int r, int v) { tr[k] += (ll)v * (r - l + 1); lazytag[k] += v; } void pushdown(int k, int l, int r) { if (lazytag[k] != 0) { int mid = l + r >> 1; change(ls, l, mid, lazytag[k]); change(rs, mid + 1, r, lazytag[k]); lazytag[k] = 0; } } void modify(int k, int l, int r, int x, int y, int v) { if (l >= x and r <= y) { change(k, l, r, v); return ; } pushdown(k, l, r); int mid = l + r >> 1; if (x <= mid) modify(ls, l, mid, x, y, v); if(y > mid) modify(rs, mid + 1, r, x, y, v); tr[k] = tr[ls] + tr[rs]; } ll query(int k, int l, int r, int x, int y) { if (l >= x and r <= y) { return tr[k]; } pushdown(k, l, r); int mid = l + r >> 1; ll res = 0; if (x <= mid) res += query(ls, l, mid, x, y); if (y > mid) res += query(rs, mid + 1, r, x, y); return res; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> a[i]; } build(1, 1, n); char c; for (int i = 1; i <= m; i++) { cin >> c; if (c == 'C') { int d, x, y; cin >> x >> y >> d; modify(1, 1, n, x, y, d); } else { int x, y; cin >> x >> y; cout << query(1, 1, n, x, y) << '\n'; } } }
|