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
| #include <bits/stdc++.h>
#define int int64_t
using pii = std::pair<int, int>;
const int kMaxN = 4e5 + 5;
int n, q; std::string O; std::vector<pii> vec[kMaxN * 4], v[kMaxN * 4][2];
pii sub(pii a, pii b) { return {a.first - b.first, a.second - b.second}; } int mul(pii a, pii b) { return a.first * b.second - a.second * b.first; } int func(pii a, pii b) { return a.first * b.first + a.second * b.second; } int getid(int dep, int x) { return (1 << (19 - dep)) + x; }
std::vector<pii> getvec(std::vector<pii> vec) { std::vector<pii> stk; std::sort(vec.begin(), vec.end()); for (auto p : vec) { for (; stk.size() >= 2 && mul(sub(p, stk.back()), sub(stk.back(), stk[stk.size() - 2])) <= 0; stk.pop_back()) {} stk.emplace_back(p); } return stk; }
int decode(int x, int64_t lastans) { return x ^ (lastans & 0x7fffffff); }
void build(int x) { std::sort(vec[x].begin(), vec[x].end()); for (auto p : vec[x]) { for (; v[x][0].size() >= 2 && mul(sub(p, v[x][0].back()), sub(v[x][0].back(), v[x][0][v[x][0].size() - 2])) <= 0; v[x][0].pop_back()) {} v[x][0].emplace_back(p); } for (auto p : vec[x]) { for (; v[x][1].size() >= 2 && mul(sub(p, v[x][1].back()), sub(v[x][1].back(), v[x][1][v[x][1].size() - 2])) >= 0; v[x][1].pop_back()) {} v[x][1].emplace_back(p); } }
int query(int x, pii p) { int o = (p.second <= 0), L = 0, R = v[x][o].size(), res = 0; while (L + 1 < R) { int mid = (L + R) >> 1; if (func(p, v[x][o][mid]) >= func(p, v[x][o][mid - 1])) L = res = mid; else R = mid; } return func(p, v[x][o][res]); }
int query(int x, int l, int r, int ql, int qr, pii p) { if (l > qr || r < ql) return -1e18; else if (l >= ql && r <= qr) return query(x, p); int mid = (l + r) >> 1; return std::max(query(x << 1, l, mid, ql, qr, p), query(x << 1 | 1, mid + 1, r, ql, qr, p)); }
void dickdreamer() { std::cin >> q >> O; int lastans = 0; for (int cs = 1; cs <= q; ++cs) { std::string op; pii p; std::cin >> op >> p.first >> p.second; if (O[0] != 'E') p.first = decode(p.first, lastans), p.second = decode(p.second, lastans); if (op[0] == 'A') { for (int i = 0; i <= 19; ++i) { vec[getid(i, n >> i)].emplace_back(p); if ((n % (1 << i)) == (1 << i) - 1) build(getid(i, n >> i)); } ++n; } else { int l, r; std::cin >> l >> r; if (O[0] != 'E') l = decode(l, lastans), r = decode(r, lastans); std::cout << (lastans = query(1, 0, (1 << 19) - 1, l - 1, r - 1, p)) << '\n'; } } }
int32_t main() { #ifdef ORZXKR freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0); int T = 1; while (T--) dickdreamer(); return 0; }
|