#include using namespace std; using ll = long long; using ld = long double; using ull = unsigned long long; template using MaxHeap = std::priority_queue; template using MinHeap = std::priority_queue, greater>; #define rep2(i, n) for (ll i = 0; i < (n); i++) #define rep3(i, l, r) for (ll i = (l); i < (r); i++) #define rrep2(i, n) for (ll i = n; i-- > 0;) #define rrep3(i, r, l) for (ll i = (r); i-- > (l);) #define overload(a, b, c, d, ...) d #define rep(...) overload(__VA_ARGS__, rep3, rep2)(__VA_ARGS__) #define rrep(...) overload(__VA_ARGS__, rrep3, rrep2)(__VA_ARGS__) #define all(x) begin(x), end(x) bool chmin(auto& lhs, auto rhs) { return lhs > rhs ? lhs = rhs, 1 : 0; } bool chmax(auto& lhs, auto rhs) { return lhs < rhs ? lhs = rhs, 1 : 0; } struct IOIO { IOIO() { std::cin.tie(0)->sync_with_stdio(0); } } ioio; struct Point { int x, y; }; int dist(Point lhs, Point rhs) { return abs(lhs.x - rhs.x) + abs(lhs.y - rhs.y); } #ifdef DEBUG struct Judge { int T; Point s, g; vector path; Judge() {} tuple input() { mt19937 mt(random_device{}()); T = mt() % 100 + 1; s = {mt() % 100, mt() % 100}; path.push_back(s); g = s; rep(_, T) { if (mt() % 2) { if (mt() % 2) { g.x += mt() % 2 ? 1 : -1; } else { g.y += mt() % 2 ? 1 : -1; } } path.push_back(g); } return {T, s, g}; } Point ask(int t) { cerr << "ask " << t << endl; return path[t]; } void answer(optional ans) { cerr << "maybe ok! w"; } }; #else struct Judge { Judge() {} tuple input() { int T; Point s, g; cin >> T >> s.x >> s.y >> g.x >> g.y; return {T, s, g}; } Point ask(int t) { cout << "? " << t << endl; int x, y; cin >> x >> y; return Point{x, y}; } void answer(optional ans) { if (ans) cout << "! " << *ans << endl; else cout << "! NaN" << endl; assert(ans); } }; #endif void solve() { #ifdef DEBUG Judge judge; #else Judge judge; #endif auto [T, s, g] = judge.input(); int L = 0; int R = T; while (R - L > 1) { int M = (L + R) / 2; auto res = judge.ask(M); if (dist(s, res) <= dist(g, res)) { L = M; } else { R = M; } } judge.answer(L); } int main() { int t = 1; // cin >> t; while (t--) solve(); }