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
| #include <iostream> #include <cstdio> #define LL long long #define ls ro << 1 #define rs ro << 1 | 1 using namespace std;
namespace SHAWN { const int N = 1e5 + 7; struct tree { int l, r; LL sum, tag; }tree[N << 2]; int n, m; LL a[N]; void pushup(int ro) { tree[ro].sum = tree[ls].sum + tree[rs].sum; } void build(int ro, int l, int r) { tree[ro].l = l; tree[ro].r = r; tree[ro].tag = 0; if (l >= r) { tree[ro].sum = a[l] - a[l - 1]; return; } int mid = l + ((r - l) >> 1); build(ls, l, mid); build(rs, mid + 1, r); pushup(ro); } void pushdown(int ro) { if (tree[ro].tag) { tree[ls].sum += (tree[ls].r - tree[ls].l + 1) * tree[ro].tag; tree[rs].sum += (tree[rs].r - tree[rs].l + 1) * tree[ro].tag; tree[ls].tag += tree[ro].tag; tree[rs].tag += tree[ro].tag; tree[ro].tag = 0; } } void update(int ro, int l, int r, LL x) { int lt = tree[ro].l, rt = tree[ro].r; if (l <= lt && r >= rt) { tree[ro].sum += (rt - lt + 1) * x; tree[ro].tag += x; return; } pushdown(ro); int mid = lt + ((rt - lt) >> 1); if (l <= mid) { update(ls, l, r, x); } if (r > mid) { update(rs, l, r, x); } pushup(ro); } LL getsum(int ro, int l, int r) { int lt = tree[ro].l, rt = tree[ro].r; if (l <= lt && r >= rt) { return tree[ro].sum; } pushdown(ro); int mid = lt + ((rt - lt) >> 1); LL res = 0; if (l <= mid) { res += getsum(ls, l, r); } if (r > mid) { res += getsum(rs, l, r); } return res; } signed work() { cin >> n >> m; for (int i = 1; i <= n; ++i) { cin >> a[i]; } build(1, 1, n + 1); while (m--) { int opt; cin >> opt; if (opt == 1) { int l, r; LL k, d; cin >> l >> r >> k >> d; if (l != r) { update(1, l, l, k); update(1, l + 1, r, d); update(1, r + 1, r + 1, -((r - l) * d + k)); } else { update(1, l, l, k); update(1, r + 1, r + 1, -k); } } else if (opt == 2) { int p; cin >> p; cout << getsum(1, 1, p) << '\n'; } } return 0; } }
signed main() { ios :: sync_with_stdio(false); cin.tie(nullptr); return SHAWN :: work(); }
|