#include <bits/stdc++.h>
#define ll long long
#define el cout << endl
#define bit(mask, i) (((mask) >> (i)) & 1)
#define BIT(n) (1ll << (n))
using namespace std;
namespace SUBTASK_1
{
const int maxlog = 9;
namespace personA
{
int encode(int N, int x, int y)
{
for (int i = 0; i <= maxlog; i++)
if (bit(x, i) ^ bit(y, i))
return i * 2 + bit(x, i) + 1;
return -1;
}
}
namespace personB
{
int decode(int N, int q, int h)
{
h--;
return bit(q, h / 2) == h % 2;
}
}
}
namespace SUBTASK_2
{
const int maxlog = 9;
namespace personA
{
int encode(int N, int x, int y)
{
for (int i = 0; i <= maxlog; i++)
if (bit(x, i) ^ bit(y, i))
return bit(y, i) * (maxlog + 1) + i + 1;
return -1;
}
}
namespace personB
{
int decode(int N, int q, int h)
{
h--;
if (h <= maxlog)
return bit(q, h);
return !bit(q, h - maxlog);
}
}
}
namespace SUBTASK_AC
{
const int maxlog = 12;
const int maxn = BIT(maxlog);
struct myStruct
{
int f[maxn + 10], cnt = 0;
constexpr myStruct() : f{}
{
for (int mask = 0; mask < BIT(maxlog); mask++)
{
if (__builtin_popcount(mask) != 6)
continue;
f[++cnt] = mask;
}
}
};
myStruct T;
namespace personA
{
int encode(int N, int x, int y)
{
x = T.f[x];
y = T.f[y];
for (int i = 0; i < maxlog; i++)
if (bit(x, i) == 1 && bit(y, i) == 0)
return i + 1;
return -1;
}
}
namespace personB
{
int decode(int N, int q, int h)
{
h--;
q = T.f[q];
return bit(q, h);
}
}
}
int encode(int N, int x, int y)
{
return SUBTASK_AC::personA::encode(N, x, y);
}
int decode(int N, int q, int h)
{
return SUBTASK_AC::personB::decode(N, q, h);
}
#include <bits/stdc++.h>
#define ll long long
#define el cout << endl
#define bit(mask, i) (((mask) >> (i)) & 1)
#define BIT(n) (1ll << (n))
using namespace std;
namespace SUBTASK_1
{
const int maxlog = 9;
namespace personA
{
int encode(int N, int x, int y)
{
for (int i = 0; i <= maxlog; i++)
if (bit(x, i) ^ bit(y, i))
return i * 2 + bit(x, i) + 1;
return -1;
}
}
namespace personB
{
int decode(int N, int q, int h)
{
h--;
return bit(q, h / 2) == h % 2;
}
}
}
namespace SUBTASK_2
{
const int maxlog = 9;
namespace personA
{
int encode(int N, int x, int y)
{
for (int i = 0; i <= maxlog; i++)
if (bit(x, i) ^ bit(y, i))
return bit(y, i) * (maxlog + 1) + i + 1;
return -1;
}
}
namespace personB
{
int decode(int N, int q, int h)
{
h--;
if (h <= maxlog)
return bit(q, h);
return !bit(q, h - maxlog);
}
}
}
namespace SUBTASK_AC
{
const int maxlog = 12;
const int maxn = BIT(maxlog);
struct myStruct
{
int f[maxn + 10], cnt = 0;
constexpr myStruct() : f{}
{
for (int mask = 0; mask < BIT(maxlog); mask++)
{
if (__builtin_popcount(mask) != 6)
continue;
f[++cnt] = mask;
}
}
};
myStruct T;
namespace personA
{
int encode(int N, int x, int y)
{
x = T.f[x];
y = T.f[y];
for (int i = 0; i < maxlog; i++)
if (bit(x, i) == 1 && bit(y, i) == 0)
return i + 1;
return -1;
}
}
namespace personB
{
int decode(int N, int q, int h)
{
h--;
q = T.f[q];
return bit(q, h);
}
}
}
int encode(int N, int x, int y)
{
return SUBTASK_AC::personA::encode(N, x, y);
}
int decode(int N, int q, int h)
{
return SUBTASK_AC::personB::decode(N, q, h);
}