Submission #1298503

#TimeUsernameProblemLanguageResultExecution timeMemory
1298503muhammad-mutahirMađioničar (COI22_madionicar)C++20
13 / 100
5071 ms948 KiB
#include <bits/stdc++.h>
using namespace std;

#define print(l) for(auto i:l) cout<<i<<" ";cout<<endl;
#define input(t,l,n) vector<t>l(n);for(int i = 0;i<n;i++)cin>>l[i];
#define int long long
#define pb push_back
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> 
#define all(l) l.begin(),l.end()
#define pii pair<int,int>
#define fi first
#define se second

const int M = 1e9+7;
const int inf = 1e18;


int bp(int x, int y, int p){
    int res = 1;
    x = x % p;
    while (y > 0) {
 
        if (y & 1)
            res = (res * x) % p;
        y = y >> 1;
        x = (x * x) % p;
    }
    return res;
}
 
int MI(int n, int p){
    return bp(n, p - 2, p);
}
int mul(int x,int y, int p){
    return x * 1ull * y % p;
}
int di(int x,int y, int p){
    return mul(x, MI(y, p), p);
}


int n , m , k , q;
// string s;
map<pair<int,int>,int>qur;

 	 	
int ask(int l,int r){
	// if(qur[{l,r}] == 1){
		// return 1;
	// }
	// else if(qur[{l,r}] == 2){
		// return 0;
	// }
	// else{
		if(k == 200000){
			while(1){
				k++;
			}
		}
		cout<<"? "<<l<<" "<<r<<endl;
		int re;
		cin>>re;
		k++;
		
		// qur[{l,r}] = re+(re == 0);
		// // update(l,r,re);
		return re;
	// }
}

void solve(int testcase_number){
    cin>>n;
	int flen = 1;
//     if l is odd
	vector<int>odd;
	for(int i = 1;i<=n;i+=2){
		odd.pb(i);
	}
	// print(odd);
	int l = 0;
	int r = odd.size();
	while(r-l >1){
		int m = (l+r)/2;
		int len = odd[m];
		int f = 0;
		int ans =0 ;
		for(int i = 1;i+len-1<=n;i++){
			ans = ask(i,i+len-1);
			 if(ans){
			 	f = 1;
			 	break;
			 }
		}
		if(f){
			l = m;
		}
		else{
			r = m;
		}
	}
	if(l != -1) flen = max(flen,odd[l]);
// 	if l is even
	vector<int>even = {1};
	for(int i = 2;i<=n;i+=2){
		even.pb(i);
	}
	// print(even);
	l = 0;
	r = even.size();

	while(r-l > 1){
		int m = (l+r)/2;

		int len = even[m];
		int f = 0;
		int ans =0 ;
		for(int i = 1;i+len-1<=n;i++){
			ans = ask(i,i+len-1);
			 if(ans){
			 	f = 1;
			 	break;
			 }
		}
		if(f){
			l = m;
		}
		else{
			r = m;
		}
	}
	
	if(l!= -1)flen = max(flen,even[l]);
	cout<<"! "<<flen<<endl;
// evve

}


signed main(){
    // ios::sync_with_stdio(0);//DO NOT USE IN INTERACTIVE
    // cin.tie(0), cout.tie(0);
    // cout << fixed<<setprecision(9);

    int t = 1;
    // cin>>t;
    for(int i = 1;i<=t;i++){
        solve(i);
    }

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...