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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| #include<bits/stdc++.h> using namespace std; #define int long long const int MAXn = 2e5; const int MAXsqrtn = 448;
template <typename T> inline void read(T &a) { char c;for (c = getchar(); (c < '0' || c > '9') && c != '-'; c = getchar());bool f = c == '-';T x = f ? 0 : (c ^ '0');for (c = getchar(); c >= '0' && c <= '9'; c = getchar()) {x = x * 10 + (c ^ '0');}a = f ? -x : x; } template <typename T, typename ...Argv> inline void read(T &a, Argv &...argv) { read(a), read(argv...); }
int sizb, cntb, le[MAXsqrtn + 10], ri[MAXsqrtn + 10], len[MAXsqrtn + 10], inb[MAXn + 10]; int sumb[MAXsqrtn + 10], lzaddb[MAXsqrtn + 10]; int sums[MAXn + 10]; void build(int n, int *a) { sizb = sqrt(n); int l = 1, r = sizb; while (l <= n) { le[++cntb] = l; ri[cntb] = r; len[cntb] = r - l + 1; for (int i = l; i <= r; ++i) { inb[i] = cntb; sumb[cntb] += a[i]; sums[i] = a[i]; } l = r + 1, r = min(l + sizb - 1, n); } } void modify(int l, int r, int v) { int inbl = inb[l], inbr = inb[r]; if (inbl == inbr) { sumb[inbl] += (r - l + 1) * v; for (int i = l; i <= r; ++i) sums[i] += v; } else { sumb[inbl] += (ri[inbl] - l + 1) * v; for (int i = l; i <= ri[inbl]; ++i) sums[i] += v; sumb[inbr] += (r - le[inbr] + 1) * v; for (int i = le[inbr]; i <= r; ++i) sums[i] += v; for (int i = inbl + 1; i < inbr; ++i) { sumb[i] += len[i] * v; lzaddb[i] += v; } } } int query(int l, int r) { int inbl = inb[l], inbr = inb[r]; int ans = 0; if (inbl == inbr) { for (int i = l; i <= r; ++i) ans += sums[i]; ans += (r - l + 1) * lzaddb[inbl]; } else { for (int i = l; i <= ri[inbl]; ++i) ans += sums[i]; ans += (ri[inbl] - l + 1) * lzaddb[inbl]; for (int i = le[inbr]; i <= r; ++i) ans += sums[i]; ans += (r - le[inbr] + 1) * lzaddb[inbr]; for (int i = inbl + 1; i < inbr; ++i) ans += sumb[i]; } return ans; }
int n, m; int a[MAXn + 10]; signed main() { read(n, m); for (int i = 1; i <= n; ++i) { read(a[i]); } build(n, a); for (int i = 1, opt, l, r, v; i <= m; ++i) { read(opt); if (opt == 1) { read(l, r, v); modify(l, r, v); } else if (opt == 2) { read(v); sumb[1] += v; sums[1] += v; } else if (opt == 3) { read(v); sumb[1] -= v; sums[1] -= v; } else if (opt == 4) { read(l, r); printf("%lld\n", query(l, r)); } else { printf("%lld\n", lzaddb[1] + sums[1]); } } return 0; }
|