Submission #1331219

#TimeUsernameProblemLanguageResultExecution timeMemory
1331219kevinsMađioničar (COI22_madionicar)C++20
38 / 100
495 ms412 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
	ll n;
	cin >> n;

	ll len = 1;

	auto extend = [&](ll mid){
		//get minimum odd and even number > len
		//even: gap between mid and mid-1
		//odd: mid itself
		ll minOdd = (len%2 ? len+2 : len+1);
		ll minEven = (len%2 ? len+1 : len+2);

		ll left1 = mid - (minOdd-1)/2, right1 = mid + (minOdd-1)/2; //for odd
		ll left2 = mid - (minEven)/2, right2 = mid + (minEven)/2 - 1; //for even

		bool a = false;
		if (left1 >= 1 && right1 <= n){
			cout << "? " << left1 << " " << right1 << "\n";
			cout.flush();
			cin >> a;
		}

		bool b = false;
		if (left2 >= 1 && right2 <= n){
			cout << "? " << left2 << " " << right2 << "\n";
			cout.flush();
			cin >> b;
		}

		if (a && b) return 2LL;
		if (a && !b) return minOdd - len;
		if (!a && b) return minEven - len;
		return 0LL;
	};

	for (ll i = 2; i <= n; ++i){
		while (true){
			ll res = extend(i);
			if (res == 0) break;
			if (len >= n){
				cout << n << "\n";
				return 0;
			}
			len += res;
		}
	}

	cout << "! " << len << "\n";
	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...