#include #include using namespace std; int main() { cin.tie(nullptr); ios::sync_with_stdio(false); int32_t H, W, d[2]; cin >> H >> W; if (H == 1) { if (W == 1) cout << "! 1 1" << endl; else { cout << "? 1 1" << endl; cin >> d[0]; int32_t l = 0, r = W; while (l + 1 < r) { const auto c = (l + r) >> 1; if (c * c <= d[0]) l = c; else r = c; } cout << "! 1 " << 1 + l << endl; } } else { if (W == 1) { cout << "? 1 1" << endl; cin >> d[0]; int32_t l = 0, r = H; while (l + 1 < r) { const auto c = (l + r) >> 1; if (c * c <= d[0]) l = c; else r = c; } cout << "! " << 1 + l << " 1" << endl; } else { cout << "? 1 1" << endl; cin >> d[0]; cout << "? 1 " << W << endl; cin >> d[1]; int32_t l = 0, r = W; while (1) { const auto c = (l + r) >> 1; if (c * c > d[0]) r = c; else if ((W - 1 - c) * (W - 1 - c) > d[1]) l = c; else { int32_t _l = 0, _r = H; while (_l + 1 < _r) { const auto _c = (_l + _r) >> 1; if (c * c + _c * _c <= d[0]) { if ((W - 1 - c) * (W - 1 - c) + _c * _c <= d[1]) _l = _c; else { l = c; break; } } else { if ((W - 1 - c) * (W - 1 - c) + _c * _c <= d[1]) { r = c; break; } else _r = _c; } } if (c * c + _l * _l == d[0] && (W - 1 - c) * (W - 1 - c) + _l * _l == d[1]) { cout << "! " << 1 + _l << ' ' << 1 + c << endl; break; } } } } } return 0; }