Cod sursa(job #1212937)

Utilizator pulseOvidiu Giorgi pulse Data 26 iulie 2014 16:40:20
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.67 kb
#include <cstdio>

#define MAX_N 100005

int N, M, T[MAX_N], Lev[MAX_N];

void dfs(int nod, int lev)
{
    Lev[nod] = lev;

    for(int i = 1; i <= N; ++i)
        if(T[i] == nod)
            dfs(i, lev+1);
}

int main()
{
    freopen("lca.in","rt",stdin);
    freopen("lca.out","wt",stdout);

    scanf("%d %d\n", &N, &M);

    for(int i = 2; i <= N; ++i)
        scanf("%d ",T+i);

    dfs(1, 0);

    for(int i = 1; i <= M; ++i)
    {
        int x, y;
        scanf("%d %d\n",&x, &y);

        while(x != y)
            if(Lev[x] > Lev[y])
                x = T[x];
            else
                y = T[y];

        printf("%d\n", x);
    }
}