#include "speedrun.h"
#include <bits/stdc++.h>
using namespace std;
// void assignHints(int subtask, int N, int A[], int B[])
// {
// setHintLen(N);
// for (int i = 1; i <= N - 1; i++)
// {
// setHint(A[i], B[i], true);
// setHint(B[i], A[i], true);
// }
// }
// void dfs(int x, int prev, int N, vector<bool> &visited)
// {
// if (visited[x])
// return;
// visited[x] = true;
// if (prev != 0)
// {
// goTo(x);
// }
// for (int i = 1; i <= N; i++)
// {
// bool adj = getHint(i);
// if (adj)
// {
// dfs(i, x, N, visited);
// }
// }
// if (prev != 0)
// {
// goTo(prev);
// }
// }
void assignHints(int subtask, int N, int A[], int B[])
{
setHintLen(20);
vector<int> adj(N + 1, 0);
for (int i = 1; i <= N - 1; i++)
{
adj[A[i]]++;
adj[B[i]]++;
}
int mxidx = max_element(adj.begin(), adj.end()) - adj.begin();
for (int i = 1; i <= N; i++)
{
for (int j = 0; j < 20; j++)
{
setHint(i, j + 1, (1 << j) & mxidx);
}
}
}
void dfs(int x, int prev, int N, vector<bool> &visited)
{
if (visited[x])
return;
visited[x] = true;
if (prev != 0)
{
goTo(x);
}
for (int i = 1; i <= N; i++)
{
dfs(i, x, N, visited);
}
if (prev != 0)
{
goTo(prev);
}
}
void speedrun(int subtask, int N, int start)
{
vector<bool> visited(N + 1, false);
int root = 0;
for (int j = 0; j < 20; j++)
{
if (getHint(j + 1))
{
root = root | (1 << j);
}
}
if (start != root)
goTo(root);
for (int i = 1; i <= N; i++)
{
if (i != root && i != start)
{
goTo(i);
goTo(root);
}
}
}