Pagini recente » Cod sursa (job #572402) | Cod sursa (job #307256) | Cod sursa (job #2336326) | Cod sursa (job #921046) | Cod sursa (job #808012)
Cod sursa(job #808012)
#include <cstdio>
#include <vector>
using namespace std;
inline int next_int() {
int n = 0, sign = 1;
char c = getchar_unlocked();
while (!('0' <= c && c <= '9')) {
sign *= c == '-' ? -1 : 1;
c = getchar_unlocked();
}
while ('0' <= c && c <= '9') {
n = n * 10 + c - '0';
c = getchar_unlocked();
}
return sign * n;
}
int N, M;
vector<int> G[111111];
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 (size_t i = 0; i < G[u].size(); i++) {
int v = G[u][i];
dfs(v, d + 1);
size[u] += size[v];
}
}
void get_chain(int u) {
chain[u] = heavy[u] ? chain[P[u]] : u;
for (size_t i = 0; i < G[u].size(); i++) {
int v = G[u][i];
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();
}
for (int i = 1; i <= N; i++) {
G[P[i]].push_back(i);
}
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;
}