#include using namespace std; #include // 可変引数repマクロ https://trap.jp/post/1224/ #define rep1(a) for (long long i = 0; i < (long long)a; i++) #define rep2(i, a) for (long long i = 0; i < (long long)a; i++) #define rep3(i, a, b) for (long long i = (long long)a; i <= (long long)b; i++) #define rep4(i, a, b, c) for (long long i = (long long)a; i <= (long long)b; i += (long long)c) #define overload4(a, b, c, d, e, ...) e #define rep(...) overload4(__VA_ARGS__, rep4, rep3, rep2, rep1)(__VA_ARGS__) #define printYesNo(is_ok) puts(is_ok ? "Possible" : "Impossible") #define ALL(v) v.begin(), v.end() #define RALL(v) v.rbegin(), v.rend() #define SORT(v) sort(ALL(v)) #define RSORT(v) sort(RALL(v)) #define REVERSE(v) reverse(ALL(v)) template using pq_asc = priority_queue, greater>; template using pq_des = priority_queue; template void printlnVector(T v) { for (auto n : v) { cout << n << endl; } } template void printVector(T v) { for (auto n : v) { cout << n << " "; } cout << endl; } int main() { long long H, W; cin >> H >> W; vector> is_ans(H, vector(W, true)); while (true) { int h = rand() % H, w = rand() % W; cout << "? " << h + 1 << " " << w + 1 << endl; flush(cout); long long d; cin >> d; if (d == -1) { break; } rep(hh, H) rep(ww, W) { long long dist = (hh - h) * (hh - h) + (ww - w) * (ww - w); if (dist != d) { is_ans[hh][ww] = false; } } bool ok = false; pair ans = {-1, -1}; rep(hh, H) rep(ww, W) { if (is_ans[hh][ww]) { if (ans == pair{-1, -1}) { ans = {hh + 1, ww + 1}; ok = true; } else { ok = false; } } } if (ok) { cout << "! " << ans.first << " " << ans.second << endl; break; } } return 0; }