Cod sursa(job #2217663)
Utilizator | Data | 1 iulie 2018 13:09:24 | |
---|---|---|---|
Problema | Lowest Common Ancestor | Scor | 30 |
Compilator | c | Status | done |
Runda | Arhiva educationala | Marime | 1.08 kb |
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100005
FILE *f, *g;
int TT[MAXN], LVL[MAXN];
int n, m;
void citire()
{
fscanf (f, "%d %d", &n, &m);
int i;
for (i = 2; i <= n; ++i)
fscanf (f, "%d", &TT[i]);
}
void dfs (int nod, int nivel)
{
LVL[nod] = nivel;
int i;
for (i = 2; i <= n; ++i)
if (TT[i] == nod)
dfs (i, nivel + 1);
}
int main()
{
f = fopen ("lca.in", "r");
g = fopen ("lca.out", "w");
citire ();
dfs (1, 1);
int i;
for (i = 0; i < m; ++i)
{
int x, y;
fscanf (f, "%d %d", &x, &y);
while (x != y)
{
if (LVL[x] > LVL[y])
x = TT[x];
else
y = TT[y];
}
fprintf (g, "%d\n", x);
}
fclose (f);
fclose (g);
return 0;
}