#include <bits/stdc++.h>
using namespace std;
#include "messy.h"
int n,w,r;
int ans[1000],ot[1000];
void ins_string(vector <int> pos){
string a="";
for(int i=0;i<n;i++) a+='0';
for(int i:pos) a[i]='1';
add_element(a);
return;
}
void solve_ins(vector <int> S_L,vector <int> S_R){
//cout<<S_L.size()<<" "<<S_R.size()<<endl;
if(S_L.size()<=1&&S_R.size()<=1) return;
//stage 1
for(int i=0;i<S_R.size();i++){
ins_string({S_L[0],S_R[i]});
}
for(int i=1;i<S_L.size();i++){
ins_string({S_R[0],S_L[0],S_L[i]});
}
for(int i=1;i<((int)S_L.size()+2)/2;i++){
ins_string({S_L[0],S_L[i]});
}
for(int i=1;i<((int)S_R.size()+2)/2;i++){
ins_string({S_R[0],S_R[i]});
}
//stage 2
vector <int> S_L_L,S_L_R,S_R_L,S_R_R;
for(int i=1;i<((int)S_L.size()+2)/2;i++){
S_L_L.push_back(S_L[i]);
}
for(int i=((int)S_L.size()+2)/2;i<(int)S_L.size();i++){
S_L_R.push_back(S_L[i]);
}
for(int i=1;i<((int)S_R.size()+2)/2;i++){
S_R_L.push_back(S_R[i]);
}
for(int i=((int)S_R.size()+2)/2;i<(int)S_R.size();i++){
S_R_R.push_back(S_R[i]);
}
solve_ins(S_L_L,S_L_R);
solve_ins(S_R_L,S_R_R);
return;
}
void ins(){
vector <int> S_L,S_R;
for(int i=0;i<(n+1)/2;i++){
ins_string({i});
S_L.push_back(i);
}
for(int i=(n+1)/2;i<n;i++){
S_R.push_back(i);
}
solve_ins(S_L,S_R);
return;
}
bool ask_string(vector <int> pos){
string a="";
for(int i=0;i<n;i++) a+='0';
for(int i:pos) a[i]='1';
return check_element(a);
}
int rn=0;
void solve_ask(vector <int> S_L,vector <int> S_R,vector <int> P_L,vector <int> P_R){
//cout<<S_L.size()<<" "<<P_L.size()<<" "<<S_R.size()<<" "<<P_R.size()<<endl;
//if(S_L.size()>0) cout<<S_L[0]<<endl;
if(S_L.size()<=1&&S_R.size()<=1){
if(S_L.size()==1) ans[S_L[0]]=P_L[0];
if(S_R.size()==1) ans[S_R[0]]=P_R[0];
return;
}
//for(int i:P_L) cout<<i<<" ! ";
//cout<<endl;
//for(int i:P_R) cout<<i<<" * ";
//cout<<endl;
vector <int> S_L_L,S_L_R,S_R_L,S_R_R;
vector <int> P_L_L,P_L_R,P_R_L,P_R_R;
ans[S_L[0]]=-1;ans[S_R[0]]=-1;
for(int i=0;i<S_L.size()-1;i++){
if(ask_string({P_L[i],P_R[0]})==1){
ans[S_L[0]]=P_L[i];
}
}
if(ans[S_L[0]]==-1) ans[S_L[0]]=P_L.back();
for(int i=0;i<S_R.size()-1;i++){
if(ask_string({P_R[i],(ans[S_L[0]] == P_L[0] ? P_L[1] : P_L[0]), ans[S_L[0]]})==1){
ans[S_R[0]]=P_R[i];
}
}
if(ans[S_R[0]]==-1) ans[S_R[0]]=P_R.back();
for(int i=0;i<S_L.size();i++){
if(ans[S_L[0]]==P_L[i]) continue;
//cout<<i<<" "<<P_L[i]<<" "<<ans[S_L[0]]<<endl;
if(ask_string({ans[S_L[0]],P_L[i]})==1){
P_L_L.push_back(P_L[i]);
}
else{
//cout<<"YESS"<<endl;
P_L_R.push_back(P_L[i]);
}
}
//exit(0);
for(int i=0;i<S_R.size();i++){
if(ans[S_R[0]]==P_R[i]) continue;
if(ask_string({ans[S_R[0]],P_R[i]})==1){
P_R_L.push_back(P_R[i]);
}
else P_R_R.push_back(P_R[i]);
}
//cout<<S_L[0]<<" "<<ans[S_L[0]]<<" "<<S_R[0]<<" "<<ans[S_R[0]]<<endl;
//Stage 2
for(int i=1;i<((int)S_L.size()+2)/2;i++){
S_L_L.push_back(S_L[i]);
}
for(int i=((int)S_L.size()+2)/2;i<(int)S_L.size();i++){
//cout<<"! "<<S_L[i]<<endl;
S_L_R.push_back(S_L[i]);
}
for(int i=1;i<((int)S_R.size()+2)/2;i++){
S_R_L.push_back(S_R[i]);
}
for(int i=((int)S_R.size()+2)/2;i<(int)S_R.size();i++){
//cout<<"! "<<S_R[i]<<endl;
S_R_R.push_back(S_R[i]);
}
solve_ask(S_L_L,S_L_R,P_L_L,P_L_R);
solve_ask(S_R_L,S_R_R,P_R_L,P_R_R);
return;
}
void ask(){
vector <int> P_L,P_R,S_L,S_R;
for(int i=0;i<(n+1)/2;i++){
S_L.push_back(i);
}
for(int i=(n+1)/2;i<n;i++){
S_R.push_back(i);
}
for(int i=0;i<n-1;i++){
if(ask_string({i})==1) P_L.push_back(i);
else P_R.push_back(i);
}
if(P_L.size()>P_R.size()) P_R.push_back(n-1);
else P_L.push_back(n-1);
solve_ask(S_L,S_R,P_L,P_R);
return;
}
std::vector<int> restore_permutation(int N, int W, int R) {
n=N;w=W;r=R;
ins();
compile_set();
ask();
vector <int> idx;
for(int i=0;i<n;i++){
//cout<<ans[i]<<" "<<endl;
ot[ans[i]]=i;
}
for(int i=0;i<n;i++){
idx.push_back(ot[i]);
}
return idx;
}