#include <bits/stdc++.h>
#include "speedrun.h"
using namespace std;
const int maxn=1e3+5;
int len=20,p[maxn];
vector <int> g[maxn];
void encode(int u,int v,int vt)
{
for (int i=0;i<10;i++)
if ((v>>i)&1)
setHint(u,vt+i,1);
}
vector <int> order={1};
bool check[maxn];
int par[maxn],nxt[maxn];
void DFS(int u)
{
for (int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if (!check[v])
{
check[v]=1;
par[v]=u;
order.push_back(v);
DFS(v);
}
}
}
void assignHints (int subtask,int n,int a[],int b[])
{
setHintLen(len);
for (int i=1;i<n;i++)
{
int u=a[i],v=b[i];
g[u].push_back(v);
g[v].push_back(u);
}
check[1]=1;
DFS(1);
for (int i=0;i<order.size()-1;i++)
nxt[order[i]]=order[i+1];
for (int i=1;i<=n;i++)
{
encode(i,par[i],1);
encode(i,nxt[i],11);
}
return;
}
int decode(int l)
{
int ans=0;
for (int i=0;i<10;i++)
{
int b=l+i;
if (getHint(b))
ans+=1<<i;
}
return ans;
}
void speedrun(int subtask,int n,int u)
{
int p,nxt;
while (u!=1)
{
p=decode(1),nxt=decode(11);
goTo(p);
u=p;
}
p=decode(1),nxt=decode(11);
int Next=nxt;
while (Next!=0)
{
p=decode(1);
if (!goTo(Next))
goTo(p);
else
{
u=Next;
Next=decode(11);
}
}
return;
}