// why is there always this nvim thing where all numbers increase by 1 if you accidentally press sth
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")
#define REP(i,a,b) for(int i=(a);i<(b);i++)
#define RREP(i,a,b) for(int i=(a)-1;i>=(b);i--)
#define pb emplace_back
int rev(int bits, int n) {
int ans = 0;
REP(i,0,bits) if(n&(1<<i)) ans |= (1<<(bits-1-i));
return ans;
}
#ifdef DEBUG
#define state printf
#define RTEfind printf("Line %d\n",__LINE__)
#else
#define state(...) 69
#define RTEfind 42
#endif
void create_circuit(int M, std::vector<int> A) {
state("create circuit called\n");
A.pb(0);
RTEfind;
int N = A.size();
RTEfind;
vector<int> C;
RTEfind;
REP(i,0,M+1) C.pb(-1);
RTEfind;
int log = 0; while((1<<log)<N) log++;
RTEfind;
int no[(2<<log)];
RTEfind;
REP(i,1<<log,2<<log) no[i]=-(i+N<(2<<log));
RTEfind;
RREP(i,1<<log,1) no[i]=-(no[i<<1]+no[i<<1|1]==-2);
RTEfind;
int cnt = 0;
RTEfind;
REP(i,1,1<<log) if(no[i]!=-1) no[i]=cnt++;
REP(i,1,1<<log) state("no[%d]=%d\n",i,no[i]);
RTEfind;
vector<int> X, Y; X.resize(cnt); Y.resize(cnt);
RTEfind;
REP(i,1,1<<log) if(no[i]!=-1) X[no[i]]=(no[i<<1]==-1?-1:-no[i<<1]-1), Y[no[i]]=(no[i<<1|1]==-1?-1:-no[i<<1|1]-1);
RTEfind;
int cur = -1;
RTEfind;
REP(i,0,N) {
RTEfind;
do {cur++;} while(rev(log,cur)+N<(1<<log));
RTEfind;
int hi = rev(log, cur) | (1<<log);
state("cur=%d,log=%d,hi=%d\n",cur,log,hi);
RTEfind;
if(hi&1) Y[no[hi>>1]]=A[i];
else X[no[hi>>1]]=A[i];
RTEfind;
}
RTEfind;
answer(C,X,Y);
}