#include<bits/stdc++.h>
#include"tree.h"
using namespace std;
mt19937 rnd(time(0));
vector <int> G[1001];
int rt,dep[1001],lca[1001][1001],fa[1001];
#define dis(u,v) (dep[u]+dep[v]-2*dep[lca[u][v]])
void init(int x,int y){
fa[x]=y,dep[x]=dep[y]+1,lca[x][x]=x;
for(int i=1;i<=n;i++) if(fa[i]||i==rt) lca[x][i]=lca[i][x]=lca[y][i];
}
void solve(int x,vector <int> s){
if(s.size()==1) return init(x,s[0]);
int mid=s.size()/2;
vector <int> now,ans;
shuffle(begin(s),end(s),rnd);
for(int i=0;i<mid;i++) now.push_back(s[i]);
int val=ask(x,now);
for(auto i:s){
int res=mid;
for(auto j:now) res+=dis(i,j);
if(res==val) ans.push_back(i);
}
solve(x,ans);
}
void solver(int n,int a,int b){
rt=rnd()%n+1;
for(int i=1;i<=n;i++) G[i!=rt?ask(rt,{i}):0].push_back(i);
for(auto i:G[1]) init(i,rt);
for(int i=2;!G[i].empty();i++) for(auto j:G[i]) solve(j,G[i-1]);
for(int i=1;i<=n;i++) if(i!=rt) answer(i,fa[i]);
}