#include <bits/stdc++.h>
using namespace std;
bool palindrome(long long l, long long r) {
cout << "? " << l+1 << " " << r+1 << endl;
cout << flush;
long long ans = 0;
cin >> ans;
return ans == 1;
}
long long n, ans = 0;
long long len[200005];
int main() {
cin >> n;
long long center = 0, right = -1;
for (int i = 0; i < n * 2 + 1; i++) {
if (i > right) {
center = i;
right = i;
long long nr = i + 1;
while (nr < n * 2 + 1) {
long long left = center * 2 - nr;
if (left < 0) {
break;
}
if (nr % 2 == 1 && !palindrome(left/2, nr/2)) {
break;
}
right = nr;
nr++;
}
len[i] = right - center;
} else {
long long mirror = 2 * center - i;
long long nr = 0;
// cout << "hi" << endl;
if (mirror < 0) {
center = i;
right = i;
goto calc;
}
if (i + len[mirror] >= right) {
center = i;
right = i + len[mirror];
goto calc;
}
goto ends;
calc:
nr = right + 1;
while (nr < n * 2 + 1) {
long long left = center * 2 - nr;
if (left < 0) {
break;
}
if (nr % 2 == 1 && !palindrome(left/2, nr/2)) {
break;
}
right = nr;
nr++;
}
len[i] = center - right;
continue;
ends:
len[i] = len[mirror];
}
if (i % 2 == 0) {
ans = max(ans, len[i] / 2);
} else {
ans = max(ans, 1 + len[i]/2);
}
}
cout << "! " << ans << endl;
cout << flush;
}
# | 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... |