#include <utility>
int send(int s);
int receive();
void encode(int N, int X) {
if (N == 3) {
send((X == 3) ? 1 : 0);
send((X == 2) ? 1 : 0);
send((X == 2) ? 1 : 0);
send((X == 3) ? 1 : 0);
} else {
int a = N / 4, s0, s1;
if (X < a) {
s0 = send(0);
s1 = send(0);
} else if (X < 2 * a) {
s0 = send(0);
s1 = send(1);
} else if (X < 3 * a) {
s0 = send(1);
s1 = send(0);
} else {
s0 = send(1);
s1 = send(1);
}
if (s0) {
if (s1) {
encode(N - a, X - a);
} else {
encode(N - a, X - ((X > a) ? a : 0));
}
} else {
if (s1) {
encode(N - a, X - ((X > 2 * a) ? a : 0));
} else {
encode(3 * a, X);
}
}
}
}
std::pair<int,int> decode(int N) {
if (N == 3) {
int a = receive(), b = receive(), c = receive(), d = receive();
if ((a + b + c + d == 0) || (a > b) || (c < d)) {
return std::pair<int,int>{1, 3};
}
if ((a < b) || (c > d)) {
return std::pair<int,int>{1, 2};
}
return std::pair<int,int>{2, 3};
} else {
int a = N / 4, s0 = receive(), s1 = receive();
std::pair<int, int> values = decode(3 * a);
if (s0) {
if (s1) {
values.first += a;
values.second += a;
} else {
if (values.first > a) values.first += a;
if (values.second > a) values.second += a;
}
} else {
if (s1) {
if (values.first > 2 * a) values.first += a;
if (values.second > 2 * a) values.second += a;
}
}
return values;
}
}