#include <iostream>
#include <vector>
#include "doll.h"
#include <algorithm>
using namespace std;
int NN, n, it, pnt;
vector<pair<int, pair<int, int>>> ord;
vector<int> swt[2];
void order(int cur, int d = 0, int pr = 0, int st = 1, int en = NN, int id = 0, int sum = 0, int lv = 0){
if (en - st == 1){
it--;
ord.push_back({id, {pr, d}});
return;
}
int mid = (st + en) / 2, sz = mid - st;
if (sum + sz >= n)
swt[0][cur] = -1;
else
it++, swt[0][cur] = -it, order(it, 0, cur, st, mid, id, sum + sz, lv + 1);
it++, swt[1][cur] = -it, order(it, 1, cur, mid, en, id + (1<<lv), sum, lv + 1);
}
void create_circuit(int m, vector<int> A){
A.push_back(0);
NN = n = A.size();
while (__builtin_popcount(NN) > 1)
NN++;
NN++;
swt[0].resize(2 * NN, 0);
swt[1].resize(2 * NN, 0);
order(++it);
sort(begin(ord), end(ord));
for (auto [i, pr] : ord)
swt[pr.second][pr.first] = A[pnt++];
while (swt[0].back() == 0)
swt[0].pop_back(), swt[1].pop_back();
swt[0].erase(begin(swt[0]));
swt[1].erase(begin(swt[1]));
vector<int> trg(m + 1, -1);
answer(trg, swt[0], swt[1]);
}