Cod sursa(job #2217663)

Utilizator mihailarminia1234Arminia Mihail mihailarminia1234 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;
}