#include using namespace std; using ll = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); const ll A_MIN = 1, A_MAX = 1'000'000; // 1回目:返答は来ない ll x = 0; cout << "? " << x << endl; ll L = A_MIN, R = A_MAX; // 符号交互に 2^k を足していく:+2^19, -2^18, +2^17, ... for (int k = 19; k >= 0; --k) { ll s = ( ( (19 - k) % 2 ) == 0 ? (1LL << k) : -(1LL << k) ); ll y = x + s; cout << "? " << y << endl; int res; if (!(cin >> res)) return 0; // 早期終了(-1 など)にも備える // 判定境界は t = x + s/2 (sは2の冪なので整数) ll t = x + s / 2; if (s > 0) { if (res == 1) { // 近づいた ⇒ a >= t L = max(L, t); } else { // 遠ざかった ⇒ a <= t-1 R = min(R, t - 1); } } else { // s < 0 if (res == 1) { // 近づいた ⇒ a <= t R = min(R, t); } else { // 遠ざかった ⇒ a >= t+1 L = max(L, t + 1); } } // 次の「直前点」 x = y; } // 20回で L==R になる(はず)。保険で範囲内に丸める。 if (L < A_MIN) L = A_MIN; if (R > A_MAX) R = A_MAX; ll a = L; // L==R を想定 cout << "! " << a << endl; return 0; }