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
| #include <bits/stdc++.h>
using i64 = int64_t; using pii = std::pair<i64, i64>;
const int kMaxN = 5e5 + 5, kMod = 998244353;
int _tp, n, q; pii pr[kMaxN]; std::vector<int> vec[(1 << 19) + 5], v[(1 << 19) + 5]; bool vis[(1 << 19) + 5];
int fix(i64 x) { return (x % kMod + kMod) % kMod; } pii sub(pii a, pii b) { return {a.first - b.first, a.second - b.second}; } i64 mul(pii a, pii b) { return a.first * b.second - a.second * b.first; } i64 func(pii a, pii b) { return a.first * b.second + a.second * b.first; } int getid(int dep, int x) { return (1 << (18 - dep)) + x; }
void build(int x) { static std::vector<int> tvec; vis[x] = 1; tvec = vec[x]; std::sort(tvec.begin(), tvec.end(), [&] (int i, int j) { return pr[i] < pr[j]; }); v[x].clear(), v[x].shrink_to_fit(); for (auto i : tvec) { for (; v[x].size() >= 2 && mul(sub(pr[i], pr[v[x].back()]), sub(pr[v[x].back()], pr[v[x][v[x].size() - 2]])) <= 0; v[x].pop_back()) {} v[x].emplace_back(i); } }
void clear(int x) { vis[x] = 0, v[x].clear(); }
i64 query(int x, pii p) { int L = 0, R = v[x].size(), res = 0; while (L + 1 < R) { int mid = (L + R) >> 1; if (func(p, pr[v[x][mid]]) >= func(p, pr[v[x][mid - 1]])) L = res = mid; else R = mid; } return func(p, pr[v[x][res]]); }
i64 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) { if (l == r) return func(p, pr[l]); else if (vis[x]) 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() { int ans = 0; n = 0; for (int cs = 1; cs <= q; ++cs) { int op; pii p; std::cin >> op; if (op == 1) { std::cin >> p.first >> p.second; p.first *= -1; pr[n] = p; for (int i = 0; i <= 18; ++i) { int t = (n >> i); vec[getid(i, t)].emplace_back(n); if ((n % (1 << i)) == (1 << i) - 1 && t && !vis[getid(i, t - 1)]) { build(getid(i, t - 1)); } } ++n; } else if (op == 2) { --n; for (int i = 0; i <= 18; ++i) { int t = (n >> i); vec[getid(i, t)].pop_back(); if ((n % (1 << i)) == (1 << i) - 1 && vis[getid(i, t)]) { clear(getid(i, t)); } } } else { int l, r; std::cin >> l >> r >> p.first >> p.second; ans ^= fix(query(1, 0, (1 << 18) - 1, l - 1, r - 1, p)); } } std::cout << ans << '\n'; for (int i = 0; i < (1 << 19); ++i) { vec[i].clear(), vec[i].shrink_to_fit(); v[i].clear(), v[i].shrink_to_fit(); vis[i] = 0; } }
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; std::cin >> _tp; while (std::cin >> q && q) dickdreamer(); return 0; }
|