//#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using arr = array<int, 2>;
using arrr = array<int, 3>;
ll last, second_last;
int query(ll p)
{
cout << "? " << p << endl;
swap(p, second_last);
swap(last, second_last);
int a;
cin >> a;
return a;
}
void answer(ll p)
{
cout << "= " << p << endl;
exit(0);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
ll n;
cin >> n;
ll lower = 1, upper = n;
vector<ll> sequence{1, n};
for (int i = 0; i < 64 - __builtin_clzll(n); i++)
{
sequence.emplace_back(sequence[i] + (1ll << i) * (i & 1 ? -1 : 1));
}
reverse(sequence.begin(), sequence.end());
auto it = sequence.begin();
query(*it++);
int ans;
while (it != sequence.end())
{
ans = query(*it++);
if (ans == 0)
{
lower = abs(second_last - last) + 1;
continue;
}
upper = abs(second_last - last);
break;
}
ll mid;
while (lower < upper)
{
mid = (lower + upper) >> 1;
if (last > n / 2) ans = query(last - mid);
else ans = query(last + mid);
if (ans == 0) lower = abs(second_last - last) + 1;
else upper = abs(second_last - last);
}
if (lower == upper)
{
answer(lower);
}
abort();
}
/*
1000000000000000000
*/
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |