Submission #1274459

#TimeUsernameProblemLanguageResultExecution timeMemory
1274459huhuhuhuhuMađioničar (COI22_madionicar)C++20
0 / 100
274 ms1764 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...