#include "speedrun.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <unordered_map>
#include <string>
#include <cmath>
#include <iomanip>
#include <array>
#include <queue>
#include <random>
#include <time.h>
#define all(a) a.begin(), a.end()
using namespace std;
typedef long long ll;
typedef long double ld;
void dfs(int v, const vector<vector<int>>& g,
	vector<int>& pr, vector<int>& obx) {
	obx.push_back(v);
	for (int u : g[v]) {
		if (u != pr[v]) {
			pr[u] = v;
			dfs(u, g, pr, obx);
		}
	}
}
void assignHints(int subtask, int N, int A[], int B[]) {
	vector<vector<int>> g(N + 1);
	for (int i = 1; i < N; i++) {
		g[A[i]].push_back(B[i]);
		g[B[i]].push_back(A[i]);
	}
	vector<int> pr(N + 1), obx;
	pr[1] = 1;
	dfs(1, g, pr, obx);
	setHintLen(20);
	for (int v = 1; v <= N; v++) {
		for (int c = 0; c < 10; c++) {
			setHint(v, c + 1, (pr[v] >> c) & 1);
		}
	}
	for (int i = 0; i + 1 < obx.size(); i++) {
		for (int c = 0; c < 10; c++) {
			setHint(obx[i], c + 11, (obx[i + 1] >> c) & 1);
		}
	}
}
int getpr() {
	int res = 0;
	for (int c = 0; c < 10; c++) {
		res |= (int)getHint(c) << c;
	}
	return res;
}
int gettarget() {
	int res = 0;
	for (int c = 0; c < 10; c++) {
		res |= (int)getHint(c + 10) << c;
	}
	return res;
}
void speedrun(int subtask, int N, int start) {
	int v = start;
	while (v > 1) {
		int pr = getpr();
		bool b = goTo(pr);
		if (!b) exit(-1);
		v = pr;
	}
	while (true) {
		int tar = gettarget();
		if (tar == 0) break;
		while (!goTo(tar)) {
			v = getpr();
			goTo(v);
		}
		v = tar;
	}
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |