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 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
| #include <cstdio> #include <cctype> #include <cstring> #include <algorithm> #include <vector> #include <queue> using namespace std; template <typename T> inline void read(T &x) { T f = 1, ch = getchar(); x = 0; while (!isdigit(ch)) { f = ch == '-' ? -1 : 1, ch = getchar(); } while (isdigit(ch)) { x = x * 10 + ch - 48, ch = getchar(); } x *= f; } template <typename T> void print(T x){ if (x < 0) { putchar('-'), x = -x; } if (x > 9) { print( x / 10); } putchar(x % 10 + '0'); } template <typename T,typename... Args> inline void read(T &t,Args&... args) { read(t);read(args...); }
const int N = 1e5 + 9; struct SEGMENTTREE{ private: struct NODE{ long long val, lz; NODE *lson, *rson; }tree[N << 1], *root; int cnt, n; void build(NODE *now, int l, int r, long long val[]) { now->lz = 0; if (l == r) { now->val = val[l]; } else { int mid = (l + r) >> 1; now->lson = &tree[++cnt], now->rson = &tree[++cnt]; build(now->lson, l, mid, val); build(now->rson, mid + 1, r, val); now->val = now->lson->val + now->rson->val; } } void pushdown(NODE *now, int l, int r, int mid) { if (!now->lz) return; now->lson->val += now->lz * (mid - l + 1); now->rson->val += now->lz * (r - mid); now->lson->lz += now->lz; now->rson->lz += now->lz; now->lz = 0; } void update(NODE *now, int l, int r, int L, int R, long long val) { if (L <= l && r <= R) { now->val += val * (r - l + 1); now->lz += val; } else { int mid = (l + r) >> 1; pushdown(now, l, r, mid); if (L <= mid) update(now->lson, l, mid, L, R, val); if (R > mid) update(now->rson, mid + 1, r, L, R, val); now->val = now->lson->val + now->rson->val; } return; } long long query(NODE *now, int l, int r, int L, int R) { if (L <= l && r <= R) { return now->val; } else { int mid = (l + r) >> 1; pushdown(now, l, r, mid); long long res = 0; if (L <= mid) res += query(now->lson, l, mid, L, R); if (R > mid) res += query(now->rson, mid + 1, r, L, R); return res; } return 0; } public: void Init(int size, long long val[]) { n = size; cnt = 0; root = &tree[++cnt]; build(root, 1, n, val); return; } long long ask(int l, int r) { return query(root, 1, n, l, r); } void modify(int l, int r, long long val) { update(root, 1, n, l, r, val); return; } }S; long long val[N]; int n, m;
signed main() { read(n, m); for (register int i = 1; i <= n; ++i) read(val[i]); S.Init(n, val); register int x = 0, y = 0, opt = 0; register long long k = 0; while (m--) { read(opt); if (opt == 1) { read(x, y, k); S.modify(x, y, k); } else { read(x, y); print(S.ask(x, y)), puts(""); } } return 0; }
|