#include <cstdio>
#include <vector>
#include <bitset>
#include <iostream>
#include <stack>
#include "library.h"
using namespace std;
#define f first
#define s second
int const N = 1010;
void Solve(int n){
vector<pair<pair<int,int>,bitset<N>>> com;
vector<vector<int>> connect(n);
vector<int> M(n,0);
int last = 0;
for(int i{}; i < n; i++) {
M[i] = 1;
int ret = Query(M);
// for(auto [n,k]:com){
// cout << k << " " << n.f << "-" << n.s << endl;
// }
// cout << ret << " " << last << endl;
// cout << "_________" << endl;
if(ret > last){
bitset<N> temp;
temp[i] = 1;
com.emplace_back(make_pair(i,i),temp);
}
else if(ret == last){
int l = 0;
int r = com.size()-1;
while(l <= r){
int md = l+(r-l)/2;
bitset<N> bs(0);
for(int i{l};i <= md;i++){
bs |= com[i].s;
}
vector<int> temp(n,0);
for(int j{};j < n;j++){
if(bs[j]) temp[j] = 1;
}
temp[i] = 1;
int Bret = Query(temp);
if(Bret == (md-l+1)){
if(md == l){
com[md].s[i] = 1;
vector<int> tempt(n,0);
tempt[com[md].f.f] = 1;
tempt[i] = 1;
if(Query(tempt) == 1){
connect[com[md].f.f].emplace_back(i);
connect[i].emplace_back(com[md].f.f);
com[md].f.f = i;
}
else{
connect[com[md].f.s].emplace_back(i);
connect[i].emplace_back(com[md].f.s);
com[md].f.s = i;
}
//cout << md << " " << i << endl;
break;
}
r = md-1;
}
else l = md+1;
}
}
else if(ret < last){
int find1 = -1;
int find2 = -1;
int l = 0;
int r = com.size()-1;
while(l <= r){
int md = l+(r-l)/2;
bitset<N> bs(0);
for(int j{l};j <= md;j++){
bs |= com[j].s;
}
vector<int> temp(n, 0);
for(int j{};j < n;j++){
if(bs[j]) temp[j] = 1;
}
temp[i] = 1;
int Bret = Query(temp);
if(Bret <= (md-l+1)){
if(md == l){
vector<int> tempt(n, 0);
tempt[com[md].f.f] = 1; tempt[i] = 1;
if(Query(tempt) == 1){
connect[com[md].f.f].push_back(i);
connect[i].push_back(com[md].f.f);
}
else{
connect[com[md].f.s].push_back(i);
connect[i].push_back(com[md].f.s);
}
find1 = md;
//cout << md << " " << i << endl;
break;
}
r = md-1;
} else l = md+1;
}
l = 0;
r = com.size()-1;
while(l <= r){
int md = l+(r-l)/2;
bitset<N> bs(0); int cnt = 0;
for(int j{l};j <= md;j++){
if(j != find1){
bs |= com[j].s;
cnt++;
}
}
if(cnt == 0){
l = md+1;
continue;
}
vector<int> temp(n, 0);
for(int j{};j < n;j++){
if(bs[j]) temp[j] = 1;
}
temp[i] = 1;
if(Query(temp) <= cnt){
if(md == l){
vector<int> tempt(n, 0);
tempt[com[md].f.f] = 1; tempt[i] = 1;
if(Query(tempt) == 1) {
connect[com[md].f.f].push_back(i);
connect[i].push_back(com[md].f.f);
} else {
connect[com[md].f.s].push_back(i);
connect[i].push_back(com[md].f.s);
}
find2 = md; break;
}
r = md-1;
} else l = md+1;
}
int f1 = find1;
int f2 = find2;
if(f1 > f2) swap(f1, f2);
int L = (connect[com[f1].f.f].size() <= 1) ? com[f1].f.f : com[f1].f.s;
int R = (connect[com[f2].f.f].size() <= 1) ? com[f2].f.f : com[f2].f.s;
com[f1].s |= com[f2].s;
com[f1].s[i] = 1;
com[f1].f.f = L;
com[f1].f.s = R;
com.erase(com.begin() + f2);
}
last = ret;
}
int beg = n;
for(int i{};i < n;i++){
if(connect[i].size() <= 1){
beg = i;
break;
}
}
// for(auto [n,k]:com) cout << k << endl;
// //cout << ret << " " << last << endl;
// cout << "_________" << endl;
stack<int> st;
st.emplace(beg);
vector<int> ans;
vector<bool> in(n);
while(!st.empty()){
int pos = st.top();st.pop();
if(in[pos]) continue;
in[pos] = true;
ans.emplace_back(pos+1);
for(auto k:connect[pos]){
st.emplace(k);
}
}
// for(int i{};i < n;i++){
// cout << i << " : ";
// for(auto k:connect[i]) cout << k << " ";
// cout << endl;
// }
// for(auto k:ans) cout << k << " ";
Answer(ans);
}