Pagini recente » Cod sursa (job #2208537) | Cod sursa (job #1372608) | Cod sursa (job #3303362) | Cod sursa (job #1961124) | Cod sursa (job #3308891)
#include <bits/stdc++.h>
using namespace std;
int bl[17][100005], height[100005];
int solve(int u, int v) {
if (height[u] < height[v])
swap(u, v);
int dif = height[u] - height[v];
for (int b = 0; b < 17; b++) {
if (dif & (1 << b))
u = bl[b][u];
}
if (u == v) return u;
for (int b = 16; b >= 0; b--) {
if (bl[b][u] != bl[b][v]) {
u = bl[b][u];
v = bl[b][v];
}
}
return bl[0][u];
}
int main() {
ifstream cin("lca.in");
ofstream cout("lca.out");
int n, q;
cin >> n >> q;
height[1] = 1;
for (int i = 2; i <= n; i++) {
cin >> bl[0][i];
height[i] = height[bl[0][i]] + 1;
}
for (int i = 1; (1 << i) < n; i++) {
for (int j = 1; j <= n; j++) {
bl[i][j] = bl[i - 1][bl[i - 1][j]];
}
}
while (q--) {
int u, v;
cin >> u >> v;
cout << solve(u, v) << '\n';
}
return 0;
}