Pagini recente » Rating Toropu Adrian (toropuadrian) | Rating Luca Tudor (Tudory) | Profil M@2Te4i | Istoria paginii utilizator/rodik_rody | Cod sursa (job #3138340)
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int n, m, x, y, *v, *lev;
void level(int node, int curr_lev)
{
lev[node] = curr_lev;
for (int i = 1; i <= n; i++)
if (v[i] == node && !lev[i])
level(i, curr_lev + 1);
}
int lca(int x, int y)
{
while (x != y)
if (lev[x] > lev[y]) {
x = v[x];
} else {
y = v[y];
}
return x;
}
int main()
{
FILE *in = fopen("lca.in", "r");
FILE *out = fopen("lca.out", "w");
fscanf(in, "%d%d", &n, &m);
v = calloc(n + 1, sizeof(int));
lev = calloc(n + 1, sizeof(int));
for (int i = 2; i <=n; i++) {
fscanf(in, "%d", &v[i]);
}
level(1, 0);
for (int i = 0; i < m; i++) {
fscanf(in, "%d%d", &x, &y);
fprintf(out, "%d\n", lca(x, y));
}
free(v);
free(lev);
fclose(in);
fclose(out);
return 0;
}