Pagini recente » Cod sursa (job #2259007) | Cod sursa (job #3223681) | Cod sursa (job #2110120) | Cod sursa (job #2812452) | Cod sursa (job #3308897)
#include <bits/stdc++.h>
using namespace std;
int rad, par[100005];
int jump[100005], h[100005];
void get_jump(int v) {
jump[v] = v;
for (int i = 1; i <= rad; i++)
jump[v] = par[jump[v]];
}
int solve(int u, int v) {
if (h[u] < h[v])
swap(u, v);
while (h[u] - h[v] >= rad)
u = jump[u];
while (h[u] != h[v])
u = par[u];
if (u == v) return u;
while (jump[v] != jump[u]) {
u = jump[u];
v = jump[v];
}
while (u != v) {
u = par[u];
v = par[v];
}
return u;
}
int main() {
ifstream cin("lca.in");
ofstream cout("lca.out");
int n, q;
cin >> n >> q;
rad = sqrt(n);
h[1] = 1;
for (int i = 2; i <= n; i++) {
cin >> par[i];
h[i] = h[par[i]] + 1;
}
for (int i = 1; i <= n; i++)
get_jump(i);
while (q--) {
int u, v;
cin >> u >> v;
cout << solve(u, v) << '\n';
}
return 0;
}