#include"speedrun.h"
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1024;
vector<int> ds[MAXN];
int root[MAXN],eul[MAXN],pos[MAXN],tdfs=0;
void dfs(int i,int pre)
{
pos[i]=++tdfs,eul[tdfs]=i,root[i]=pre;
for(auto v:ds[i]) if(v!=pre) dfs(v,i);
}
void setHintNode(int idx,int rt,int nx)
{
for(int i=1;i<=10;i++) setHint(idx,i,(rt>>(i-1))%2);
for(int i=11;i<=20;i++) setHint(idx,i,(nx>>(i-11))%2);
}
void assignHints(int subtask,int N,int A[],int B[])
{
setHintLen(20);
for(int i=1;i<=N-1;i++) ds[A[i]].push_back(B[i]),ds[B[i]].push_back(A[i]);
dfs(1,0);
for(int i=1;i<=N;i++)
{
int rt=root[i],nx=0;
if(pos[i]<N) nx=eul[pos[i]+1];
setHintNode(i,rt,nx);
}
}
int getRoot()
{
int ans=0;
for(int i=10;i;i--) ans=ans*2+getHint(i);
return ans;
}
int getNext()
{
int ans=0;
for(int i=20;i>10;i--) ans=ans*2+getHint(i);
return ans;
}
void speedrun(int subtask,int N,int start)
{
int res=getLength();
while(getRoot()) goTo(getRoot());
for(int i=1;i<N;i++)
{
int nx=getNext();
bool ck=goTo(nx);
while(!ck)
{
goTo(getRoot());
ck=goTo(nx);
}
}
}