1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| #include<bits/stdc++.h> #define x first #define y second #define ok cout << "ok" << endl; using namespace std; typedef long long ll; typedef unsigned long long ull; typedef vector<int> vi; typedef pair<int, int> pii; typedef pair<ll, ll> pll; const long double PI = acos(-1.0); const int INF = 0x3f3f3f3f; const ll LINF = 0x3f3f3f3f3f3f3f3f; const double Eps = 1e-7; const int N = 1e5+9;
int ask(int id) { int ans; printf("? %d\n", id); fflush(stdout); scanf("%d", &ans); return ans; }
int n, m, d[N], l, r;
int main(void) { if(fopen("in", "r")!=NULL) {freopen("in", "r", stdin); freopen("out", "w", stdout);} cin >> n; m = n / 2; d[1] = ask(1) - ask(1 + m); if(d[1] & 1) { printf("! -1\n"); fflush(stdout); return 0; } if(d[1] == 0) { printf("! 1\n"); fflush(stdout); return 0; } l = 1, r = n / 2; while(true && l + 1 != r) { int mid = (l + r) >> 1; d[mid] = ask(mid) - ask(mid + m); if(d[mid] == 0) { printf("! %d\n", mid); fflush(stdout); return 0; } if((d[l] < 0 && d[mid] < 0) || (d[l] > 0 && d[mid] > 0)) l = mid; else r = mid; } d[l] = ask(l) - ask(l + m); if(d[l] == 0) printf("! %d\n", l); else printf("! %d\n", r);
return 0; }
|