Pagini recente » Cod sursa (job #309295) | Cod sursa (job #3039271) | Cod sursa (job #1978411) | Cod sursa (job #2172059) | Cod sursa (job #808010)
Cod sursa(job #808010)
#include <cstdio>
using namespace std;
inline int next_int() {
int d;
scanf("%d", &d);
return d;
}
int N, M;
int P[111111], chain[111111], size[111111], depth[111111], seen[111111], heavy[111111];
void dfs(int u, int d) {
if (seen[u]) {
return;
}
seen[u] = true;
size[u] = 1;
depth[u] = d;
chain[u] = u;
for (int v = 1; v <= N; v++) {
if (P[v] == u) {
dfs(v, d + 1);
size[u] += size[v];
}
}
}
void get_chain(int u) {
chain[u] = heavy[u] ? chain[P[u]] : u;
for (int v = 1; v <= N; v++) {
if (P[v] == u) {
get_chain(v);
}
}
}
int lca(int u, int v) {
while (chain[u] != chain[v]) {
if (depth[chain[u]] < depth[chain[v]]) {
v = P[chain[v]];
} else {
u = P[chain[u]];
}
}
return depth[u] < depth[v] ? u : v;
}
int main() {
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
N = next_int();
M = next_int();
for (int i = 2; i <= N; i++) {
P[i] = next_int();
}
dfs(1, 0);
get_chain(1);
for (int i = 0; i < M; i++) {
int u = next_int();
int v = next_int();
printf("%d\n", lca(u, v));
}
return 0;
}