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
| #include <iostream> #include <string> #define MOD1 39989 #define MOD2 1000000000 #define MAXT 40000 using namespace std; typedef pair<double, int> pdi;
const double eps = 1e-9;
int cmp(double x, double y) { if (x - y > eps) return 1; if (y - x > eps) return -1; return 0; }
struct line { double k, b; } p[100005];
int s[160005]; int cnt;
double calc(int id, int d) { return p[id].b + p[id].k * d; }
void add(int x0, int y0, int x1, int y1) { cnt++; if (x0 == x1) p[cnt].k = 0, p[cnt].b = max(y0, y1); else p[cnt].k = 1.0 * (y1 - y0) / (x1 - x0), p[cnt].b = y0 - p[cnt].k * x0; }
void upd(int root, int cl, int cr, int u) { int &v = s[root], mid = (cl + cr) >> 1; int bmid = cmp(calc(u, mid), calc(v, mid)); if (bmid == 1 || (!bmid && u < v)) swap(u, v); int bl = cmp(calc(u, cl), calc(v, cl)), br = cmp(calc(u, cr), calc(v, cr)); if (bl == 1 || (!bl && u < v)) upd(root << 1, cl, mid, u); if (br == 1 || (!br && u < v)) upd(root << 1 | 1, mid + 1, cr, u); }
void update(int root, int cl, int cr, int l, int r, int u) { if (l <= cl && cr <= r) { upd(root, cl, cr, u); return; } int mid = (cl + cr) >> 1; if (l <= mid) update(root << 1, cl, mid, l, r, u); if (mid < r) update(root << 1 | 1, mid + 1, cr, l, r, u); }
pdi pmax(pdi x, pdi y) { if (cmp(x.first, y.first) == -1) return y; else if (cmp(x.first, y.first) == 1) return x; else return x.second < y.second ? x : y; }
pdi query(int root, int l, int r, int d) { if (r < d || d < l) return {0, 0}; int mid = (l + r) >> 1; double res = calc(s[root], d); if (l == r) return {res, s[root]}; return pmax({res, s[root]}, pmax(query(root << 1, l, mid, d), query(root << 1 | 1, mid + 1, r, d))); }
int main() { ios::sync_with_stdio(false); int n, lastans = 0; cin >> n; while (n--) { int op; cin >> op; if (op == 1) { int x0, y0, x1, y1; cin >> x0 >> y0 >> x1 >> y1; x0 = (x0 + lastans - 1 + MOD1) % MOD1 + 1, x1 = (x1 + lastans - 1 + MOD1) % MOD1 + 1; y0 = (y0 + lastans - 1 + MOD2) % MOD2 + 1, y1 = (y1 + lastans - 1 + MOD2) % MOD2 + 1; if (x0 > x1) swap(x0, x1), swap(y0, y1); add(x0, y0, x1, y1); update(1, 1, MOD1, x0, x1, cnt); } else { int x; cin >> x; x = (x + lastans - 1 + MOD1) % MOD1 + 1; cout << (lastans = query(1, 1, MOD1, x).second) << endl; } } return 0; }
|