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
| #include <bits/stdc++.h> using namespace std; const int N = 100010; int n, m; int t[N << 2][4], tag[N << 2][4]; void update(int v) { for (int i = 0; i < 4; ++i) { t[v][i] = max(t[v][i], max(t[v << 1][i], t[v << 1 | 1][i])); } } void pushdown(int v) { for (int i = 0; i < 4; ++i) { if (tag[v][i]) { t[v << 1][i] += tag[v][i]; t[v << 1 | 1][i] += tag[v][i]; tag[v << 1][i] += tag[v][i]; tag[v << 1 | 1][i] += tag[v][i]; tag[v][i] = 0; } } } void add(int v, int l, int r, int x, int y, int a2, int a3, int a5, int a7) { if (x <= l && r <= y) { if (a2) { tag[v][0] += a2; t[v][0] += a2; } if (a3) { tag[v][1] += a3; t[v][1] += a3; } if (a5) { tag[v][2] += a5; t[v][2] += a5; } if (a7) { tag[v][3] += a7; t[v][3] += a7; } return; } int mid = l + r >> 1; pushdown(v); if (x <= mid) add(v << 1, l, mid, x, y, a2, a3, a5, a7); if (mid < y) add(v << 1 | 1, mid + 1, r, x, y, a2, a3, a5, a7); update(v); return; } int query(int v, int l, int r, int x, int y) { if (x <= l && r <= y) { int mx = 0; for (int i = 0; i < 4; ++i) { mx = max(mx, t[v][i]); } return mx; } int mid = l + r >> 1, res = 0; pushdown(v); if (x <= mid) res = max(res, query(v << 1, l, mid, x, y)); if (mid < y) res = max(res, query(v << 1 | 1, mid + 1, r, x, y)); update(v); return res; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; for (int i = 1; i <= m; ++i) { string op; int l, r, x; cin >> op >> l >> r; if (op == "MULTIPLY") { cin >> x; if (x == 2) { add(1, 1, n, l, r, 1, 0, 0, 0); } else if (x == 3) { add(1, 1, n, l, r, 0, 1, 0, 0); } else if (x == 4) { add(1, 1, n, l, r, 2, 0, 0, 0); } else if (x == 5) { add(1, 1, n, l, r, 0, 0, 1, 0); } else if (x == 6) { add(1, 1, n, l, r, 1, 1, 0, 0); } else if (x == 7) { add(1, 1, n, l, r, 0, 0, 0, 1); } else if (x == 8) { add(1, 1, n, l, r, 3, 0, 0, 0); } else if (x == 9) { add(1, 1, n, l, r, 0, 2, 0, 0); } else if (x == 10) { add(1, 1, n, l, r, 1, 0, 1, 0); } } else { cout << "ANSWER " << query(1, 1, n, l, r) << "\n"; } } return 0; }
|