/* -*- coding: utf-8 -*- * * 3018.cc: No.3018 逶ョ髫縺怜ョ晄爾縺・- yukicoder */ #include #include #include #include using namespace std; /* constant */ /* typedef */ using pii = pair; using vpii = vector; /* global variables */ /* subroutines */ int query(int y, int x) { printf("? %d %d\n", y, x); fflush(stdout); int d; scanf("%d", &d); return d; } void fin(int y, int x) { printf("! %d %d\n", y, x); fflush(stdout); } vpii calcps(int h, int w, int y0, int x0, int d0) { vpii ps; for (int y = 1; y <= h; y++) for (int x = 1; x <= w; x++) { int dy = y - y0, dx = x - x0; int d = dy * dy + dx * dx; if (d == d0) ps.push_back({y, x}); } return ps; } /* main */ int main() { int h, w; scanf("%d%d", &h, &w); if (h == 1 && w == 1) { fin(1, 1); return 0; } int ty = 0, tx = 0; int d0 = query(1, 1); if (d0 < 0) return 0; auto ps0 = calcps(h, w, 1, 1, d0); if (ps0.size() == 1) ty = ps0[0].first, tx = ps0[0].second; else { int d1 = query(h, 1); if (d1 < 0) return 0; auto ps1 = calcps(h, w, h, 1, d1); auto vit0 = ps0.begin(), vit1 = ps1.begin(); for (;;) { if (*vit0 < *vit1) vit0++; else if (*vit0 > *vit1) vit1++; else { ty = vit0->first, tx = vit0->second; break; } } } fin(ty, tx); //for (int i = 0; i < 1000000000; i++); return 0; }