#include <bits/stdc++.h>
#include"communication.h"
using namespace std;
#pragma GCC optimize("Ofast")
#define ll long long
#define fi first
#define se second
#define pb push_back
#define vi vector<int>
#define vl vector<ll>
#define pi pair<int, int>
#define pl pair<ll,ll>
#define all(x) (x).begin(),(x).end()
struct interval {
	int l, r;
	int sze() {
		return r-l+1;
	}
	bool in(int a) {
		return (l<=a && a<=r);
	}
};
void encode(int n, int x) {
	vector<interval> ok={{1,n}},nok;
	int oksze=n,noksze=0;
	while (oksze+noksze>3) {
		vector<interval> oka,okb,noka,nokb;
		int okasze=0,okbsze=0,nokasze=0,nokbsze=0;
		bool a=0;
		for (int i=0; i<ok.size(); i++) {
			if (okasze+ok[i].sze()<=oksze/2) {
				oka.pb(ok[i]);
				okasze+=oka.back().sze();
			}
			else if (okasze<=oksze/2) {
				oka.pb({ok[i].l,ok[i].l+oksze/2-okasze-1});
				okb.pb({ok[i].l+oksze/2-okasze,ok[i].r});
				okasze+=oka.back().sze();
				okbsze+=okb.back().sze();
			}
			else {
				okb.pb({ok[i]});
				okbsze+=okb.back().sze();
			}
			if (oka.size()) {
				a|=(oka.back().in(x));
			}
		}
		for (int i=0; i<nok.size(); i++) {
			if (nokasze+nok[i].sze()<=noksze/2) {
				noka.pb(nok[i]);
				nokasze+=noka.back().sze();
			}
			else if (nokasze<=noksze/2) {
				noka.pb({nok[i].l,nok[i].l+noksze/2-nokasze-1});
				nokb.pb({nok[i].l+noksze/2-nokasze,nok[i].r});
				nokasze+=noka.back().sze();
				nokbsze+=nokb.back().sze();
			}
			else {
				nokb.pb({nok[i]});
				nokbsze+=nokb.back().sze();
			}
			if (noka.size()) {
				a|=(noka.back().in(x));
			}
		}
		bool ret=send(a);
		ok.clear();
		if (ret==0) {
			for (auto aa:okb) {
				ok.pb(aa);
			}
			for (auto aa:nokb) {
				ok.pb(aa);
			}
			nok=oka;
			oksze=okbsze+nokbsze;
			noksze=okasze;
		}
		else {
			for (auto aa:oka) {
				ok.pb(aa);
			}
			for (auto aa:noka) {
				ok.pb(aa);
			}
			nok=okb;
			oksze=okasze+nokasze;
			noksze=okbsze;
		}
	}
	vi nums;
	for (auto aa:ok) {
		for (int i=aa.l; i<=aa.r; i++) {
			nums.pb(i);
		}
	}
	for (auto aa:nok) {
		for (int i=aa.l; i<=aa.r; i++) {
			nums.pb(i);
		}
	}
	if (nums.size()==2) {
		return;
	}
	if (x==nums[0]) {
		send(0);send(0);send(0);send(0);
	}
	else if (x==nums[1]) {
		send(0);send(1);send(1);send(0);
	}
	else {
		send(1);send(0);send(0);send(1);
	}
}
vi nums={0b0000,0b0110,0b1001,0b1111};
set<int> valid={0b0000,0b0001,0b0010,0b0100,0b0101,0b1000,0b1001,0b1010};
pi get(int a) {
	pi ret={-1,-1};
	for (int i=0; i<4; i++) {
		if (valid.count(a^nums[i])) {
			if (ret.fi==-1) {
				ret.fi=i;
			}
			else {
				ret.se=i;
			}
		}
	}
	return ret;
}
pi decode(int n) {
	vector<interval> ok={{1,n}},nok;
	int oksze=n,noksze=0;
	while (oksze+noksze>3) {
		vector<interval> oka,okb,noka,nokb;
		int okasze=0,okbsze=0,nokasze=0,nokbsze=0;
		for (int i=0; i<ok.size(); i++) {
			if (okasze+ok[i].sze()<=oksze/2) {
				oka.pb(ok[i]);
				okasze+=oka.back().sze();
			}
			else if (okasze<=oksze/2) {
				oka.pb({ok[i].l,ok[i].l+oksze/2-okasze-1});
				okb.pb({ok[i].l+oksze/2-okasze,ok[i].r});
				okasze+=oka.back().sze();
				okbsze+=okb.back().sze();
			}
			else {
				okb.pb({ok[i]});
				okbsze+=okb.back().sze();
			}
		}
		for (int i=0; i<nok.size(); i++) {
			if (nokasze+nok[i].sze()<=noksze/2) {
				noka.pb(nok[i]);
				nokasze+=noka.back().sze();
			}
			else if (nokasze<=noksze/2) {
				noka.pb({nok[i].l,nok[i].l+noksze/2-nokasze-1});
				nokb.pb({nok[i].l+noksze/2-nokasze,nok[i].r});
				nokasze+=noka.back().sze();
				nokbsze+=nokb.back().sze();
			}
			else {
				nokb.pb({nok[i]});
				nokbsze+=nokb.back().sze();
			}
		}
		bool ret=receive();
		ok.clear();
		if (ret==0) {
			for (auto aa:okb) {
				ok.pb(aa);
			}
			for (auto aa:nokb) {
				ok.pb(aa);
			}
			nok=oka;
			oksze=okbsze+nokbsze;
			noksze=okasze;
		}
		else {
			for (auto aa:oka) {
				ok.pb(aa);
			}
			for (auto aa:noka) {
				ok.pb(aa);
			}
			nok=okb;
			oksze=okasze+nokasze;
			noksze=okbsze;
		}
	}
	vi nums;
	for (auto aa:ok) {
		for (int i=aa.l; i<=aa.r; i++) {
			nums.pb(i);
		}
	}
	for (auto aa:nok) {
		for (int i=aa.l; i<=aa.r; i++) {
			nums.pb(i);
		}
	}
	if (nums.size()==2) {
		return {nums[0],nums[1]};
	}
	int t=receive()*8+receive()*4+receive()*2+receive();
	pi temp=get(t);
	return {nums[min(temp.fi,2)],nums[min(temp.se,2)]};
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |