1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| #include <bits/stdc++.h> using namespace std; #define ll long long const int maxn = 2e5 + 10; vector<int>e[maxn]; int G[maxn][20], H[maxn][20]; int dep[maxn], n; void dfs(int x, int fa, int F[][20]) { F[x][0] = fa; for (int i = 0; i < e[x].size(); ++i) { int u = e[x][i]; for (int i = 1; i <= 17; ++i) F[x][i] = F[F[x][i - 1]][i - 1]; if (u == fa) continue; dfs(u, x, F); } return; } void init() { for (int i = 1; i <= n; ++i) dep[i] = 0; } void FIND(int x, int fa) { for (int i = 0; i < e[x].size(); ++i) { if (e[x][i] == fa) continue; dep[e[x][i]] = dep[x] + 1; FIND(e[x][i], x); } } int get() { int mx = 0, ans = 0; for (int i = 1; i <= n; ++i) if (dep[i] > mx) mx = dep[i], ans = i; return ans; } int solve(int x, int dis, int F[][20]) { int now = x; for (int i = 20; i >= 0; --i) if ((dis >> i) & 1) now = F[now][i]; return now == 0 ? -1 : now; } int main() { cin >> n; for (int i = 1; i <= n - 1; ++i) { int x, y; scanf("%d%d", &x, &y); e[x].push_back(y); e[y].push_back(x); } init(); FIND(1, 0); int L = get(); init(); FIND(L, 0); int R = get(); dfs(L, 0, G); dfs(R, 0, H); int Q; cin >> Q; for (int i = 1; i <= Q; ++i) { int x, y; scanf("%d%d", &x, &y); int TA = solve(x, y, G); int TB = solve(x, y, H); printf("%d\n", max(TA, TB)); } return 0; }
|