#include <bits/stdc++.h>
using namespace std;
using vi = vector<int>;
using ii = pair<int, int>;
using vb = vector<bool>;
#define forn(i, n) for (int i = 0; i < int(n); i++)
#define forsn(i, s, n) for (int i = int(s); i < int(n); i++)
#define sz(x) int(x.size())
#define all(x) begin(x), end(x)
#define pb push_back
void add_element(string x);
bool check_element(string x);
void compile_set();
void init(int l, int r, string base) {
if (r - l == 1) return;
int m = (l + r) / 2;
forsn(i, l, m) {
string s = base; s[i] = '1';
add_element(s);
}
string leftBase = base, rightBase = base;
forsn(i, m, r) leftBase[i] = '1';
forsn(i, l, m) rightBase[i] = '1';
init(l, m, leftBase);
init(m, r, rightBase);
}
void solve(int l, int r, string base, vi &indices, vi &perm) {
if (r - l == 1) {
assert(sz(indices) == 1);
perm[indices[0]] = l;
return;
}
vi zeros, ones;
for (int i : indices) {
string s = base; s[i] = '1';
if (check_element(s)) ones.pb(i);
else zeros.pb(i);
}
string leftBase = base, rightBase = base;
for (int i : zeros) leftBase[i] = '1';
for (int i : ones) rightBase[i] = '1';
int m = (l + r) / 2;
solve(l, m, leftBase, ones, perm);
solve(m, r, rightBase, zeros, perm);
}
vi restore_permutation(int n, int w, int r) {
string base(n, '0');
init(0, n, base);
vi perm(n);
vi indices(n);
iota(all(indices), 0);
compile_set();
solve(0, n, base, indices, perm);
return perm;
}