Cod sursa(job #1173226)

Utilizator visanrVisan Radu visanr Data 18 aprilie 2014 22:33:59
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>
#include <vector>
using namespace std;

const int NMAX = 100010;

int N, M, X, Y, First[NMAX], Last[NMAX], K, Ancestor[18][NMAX];
vector<int> G[NMAX];

void DFS(int Node, int Father)
{
    First[Node] = ++ K;
    Ancestor[0][Node] = Father;

    for(vector<int> :: iterator it = G[Node].begin(); it != G[Node].end(); ++ it)
        DFS(*it, Node);

    Last[Node] = ++ K;
}

bool Anc(int X, int Y)
{
    return First[X] <= First[Y] && Last[Y] <= Last[X];
}

int GetLCA(int X, int Y)
{
    if(Anc(X, Y)) return X;
    for(int Step = 17; Step >= 0; Step --)
        if(Ancestor[Step][X] && !Anc(Ancestor[Step][X], Y))
            X = Ancestor[Step][X];
    return Ancestor[0][X];
}

int main()
{
    freopen("lca.in", "r", stdin);
    freopen("lca.out", "w", stdout);

    scanf("%i %i", &N, &M);
    for(int i = 2; i <= N; ++ i)
    {
        scanf("%i", &X);
        G[X].push_back(i);
    }

    DFS(1, 0);

    for(int i = 1; i <= 17; ++ i)
        for(int j = 1; j <= N; ++ j)
            Ancestor[i][j] = Ancestor[i - 1][Ancestor[i - 1][j]];

    for(; M; M --)
    {
        scanf("%i %i", &X, &Y);
        printf("%i\n", GetLCA(X, Y));
    }
}