Cod sursa(job #1349802)

Utilizator Miruna_DMiruna Miruna_D Data 20 februarie 2015 14:59:55
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <fstream>
#include <vector>
#define Nmax 100001
#define Lmax 21
using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m;
int log[Nmax],Level[Nmax],F[Lmax][Nmax];
vector <int> G[Nmax];
void read()
{
    fin>>n>>m;
    int i;
    for(i=2;i<=n;i++)
    {
        fin>>F[0][i];
        G[F[0][i]].push_back(i);
    }

}
void DFS(int nod, int lev)
{
    Level[nod]=lev;

    for(unsigned int i=0;i<G[nod].size();i++)
        DFS(G[nod][i],lev+1);

}
int LCA(int x,int y)
{


    for (;Level[x]>Level[y]; x=F[log[Level[x]-Level[y]]][x]);
    for (;Level[y]>Level[x]; y=F[log[Level[y]-Level[x]]][y]);

    if (x==y)
        return x;

    for(int step=log[Level[x]];step>=0;step--)
    {
    if (F[step][x]!=F[step][y])
    {
    x=F[step][x];
    y=F[step][y];
    }
    }
    return F[0][x];

}

void BuildLog()
{
    int i;
    for(i=2;i<=Nmax;i++)
        log[i]=log[i/2]+1;
}



int main()
{
    read();
    BuildLog();

    int k,i;
    for(k=1;k<=log[n];k++)
        for(i=1;i<=n;i++)
            F[k][i]=F[k-1][F[k-1][i]];

    DFS(1,0);

    for(i=1;i<=m;i++)
    {
        int x,y;
        fin>>x>>y;
        fout<<LCA(x,y)<<"\n";
    }

    return 0;
}