#include "doll.h"
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fall(i,a,b) for(int i=a;i<=b;i++)
#define rfall(i,a,b) for(int i=a;i>=b;i--)
#define sz(x) (int) x.size()
#define pb push_back
#define all(x) x.begin(),x.end()
const int MAXN=5e5+10;
const ll inf=1e17;
typedef pair<int,int> pii;
int n,X[MAXN],Y[MAXN],cur=1,vis[MAXN],msb;
vector<int> arr;
void buildfull(int ind,int quan){
if(quan==1) Y[ind]=-1;
if(quan<=2)return;
cur++;
X[ind]=-cur;
cur++;
Y[ind]=-cur;
buildfull(-X[ind],quan>>1);
buildfull(-Y[ind],quan>>1);
}
void build(int bit,int ind){
if(bit==msb){
if(bit!=0){
cur++;
X[ind]=-cur;
buildfull(cur,(1<<(bit-1)));
cur++;
Y[ind]=-cur;
buildfull(cur,(1<<(bit-1)));
}
else X[ind]=-1;
return;
}
cur++;
X[ind]=-cur;
build(bit-1,cur);
if(n&(1<<bit)){
cur++;
Y[ind]=-cur;
buildfull(cur,(1<<bit));
}
else Y[ind]=-1;
return;
}
void get_path(int x){
//cout<<x<<" ";
if(x==0) return;
if(x>0){
get_path(-1);
return;
}
vis[-x]++;
if(vis[-x]==1 && X[-x]==0){
cur++;
X[-x]=arr[cur];
}
else if(vis[-x]==2 && Y[-x]==0){
cur++;
if(cur>=sz(arr)) Y[-x]=0;
else Y[-x]=arr[cur];
}
if(vis[-x]%2==1) get_path(X[-x]);
else get_path(Y[-x]);
}
void create_circuit(int M, std::vector<int> A){
n=sz(A)+1;
arr=A;
rfall(i,20,0)if(n&(1<<i)) msb=i;
rfall(i,20,0){
if(n&(1<<i)){
build(i,1);
break;
}
}
vector<int> pos(M+1,-1),y(cur),x(cur);
int tam=cur;
cur=-1;
get_path(-1);
fall(i,0,tam-1) x[i]=X[i+1],y[i]=Y[i+1];
//fall(i,1,tam) if(vis[i]%2)cout<<i<<"\n";
answer(pos,x,y);
}
/*int main(){
int M,N; cin>>M>>N;
vector<int> A(N);
for(auto&u:A)cin>>u;
create_circuit(M,A);
}*/