Pagini recente » Cod sursa (job #1936215) | Cod sursa (job #2332218) | Cod sursa (job #2332449) | Cod sursa (job #3191921) | Cod sursa (job #2284706)
#include <stdio.h>
#include <math.h>
const int NMAX = 100005;
const int MMAX = 2000005;
const int H = 200;
int p[NMAX];
int p2[NMAX];
//int lev[NMAX];
int N, M;
void dfs(int child, int parent, int l) {
p2[child] = parent;
if (l % H == 0) {
parent = child;
}
for (int i = 1; i <= N; ++i) {
if (p[i] == child) {
dfs(i, parent, l + 1);
}
}
}
void lca(int x, int y) {
while (p2[x] != p2[y]) {
if (p2[x] < p2[y]) {
y = p2[y];
} else {
x = p2[x];
}
}
while (x != y) {
if (x < y) {
y = p[y];
} else {
x = p[x];
}
}
printf("%d\n", x);
}
int main() {
freopen("lca3.in", "r", stdin);
freopen("lca3.out", "w", stdout);
scanf("%d %d", &N, &M);
p[1] = 0;
for (int i = 2; i <= N; ++i) {
scanf("%d", &p[i]);
}
dfs(1,0,0);
for (int i = 0; i < M; ++i) {
int x,y;
scanf("%d%d", &x, &y);
lca(x,y);
}
fclose(stdin);
fclose(stdout);
return 0;
}