#include <vector>
#include <bits/stdc++.h>
using namespace std;
#include "messy.h"
const int nx = 128;
int n, l[nx], r[nx];
void process(int ll, int rr) {
if (ll >= rr) return;
int mid = (ll + rr) >> 1;
string s;
s.resize(n, '1');
for (int i = ll; i <= rr; i++) s[i] = '0';
for (int i = ll; i <= mid; i++) {
s[i] = '1';
add_element(s);
s[i] = '0';
}
process(ll, mid);
process(mid + 1, rr);
}
vector<int> restore_permutation(int nn, int write, int read) {
n = nn;
fill(r, r + n, n - 1);
process(0, n - 1);
//cout << "sum1\n";
compile_set();
//cout << "sum2\n";
while (1) {
bool upd = 0;
vector<int> qrs[n];
for (int i = 0; i < n; i++) {
if (l[i] != r[i]) qrs[(l[i]+r[i])>>1].emplace_back(i), upd = 1;
}
if (!upd) break;
for (int mid = 0; mid < n; mid++) {
for (auto idx : qrs[mid]) {
string s; s.resize(n, '0');
for (int i = 0; i < n; i++) {
if (l[i] > r[idx] || r[i] < l[idx]) s[i] = '1';
}
s[idx] = '1';
//cout << s << "\n";
bool x = check_element(s);
//cout << "sum3\n";
if (x) r[idx] = mid;
else l[idx] = mid + 1;
}
}
}
vector<int> ans(n);
for (int i = 0; i < n; i++) {
ans[i] = l[i];
//assert(cout << l[i] << " ");
}
return ans;
}