#include "cave.h"
#include <bits/stdc++.h>
#define ff first
#define ss second
#define pb push_back
#define all(v) v.begin(), v.end()
using namespace std;
constexpr int MAX = 2e+5 + 1, INF = 2e+9, MOD = 1e+9 + 7, K = 31;
vector <int> null;
int n;
int ask(vector <int> &v) {
int a[n];
for (int i = 0; i < n; i++) a[i] = v[i];
return tryCombination(a);
}
int get(int x, vector <int> v) {
vector <int> f = null;
int t = 0;
int q1 = ask(f);
// if (q1 < x) {
// abort();
// }
if (q1 == x) {
t ^= 1;
}
for (int &i : v) f[i] = t;
int l = 0, r = v.size() - 1;
while (l < r) {
int mid = (l + r) / 2;
for (int i = l; i <= mid; i++) {
f[v[i]] = 1 - t;
}
int q2 = ask(f);
int nl = l, nr = r;
if (q2 == x) {
nr = mid;
}
else nl = mid + 1;
for (int i = l; i <= mid; i++) f[v[i]] = t;
l = nl, r = nr;
}
null[v[l]] = t;
return v[l];
}
void exploreCave(int N) {
n = N;
null.assign(n, 0);
vector <int> v;
for (int i = 0; i < n; i++) v.pb(i);
int S[n], D[n];
for (int i = 0; i < n; i++) {
int id = get(i, v);
S[id] = i;
// cerr << id << endl;
vector <int> nv;
for (int &j : v) {
if (j == id) continue;
nv.pb(j);
}
v.swap(nv);
// for (int &j : null) cerr << j << ' '; cerr << endl;
}
for (int i = 0; i < n; i++) {
D[i] = null[i];
}
answer(D, S);
}