Cod sursa(job #1363191)

Utilizator emanuel_rRamneantu Emanuel emanuel_r Data 26 februarie 2015 19:38:22
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>
#include <vector>
#define NMax 100005
using namespace std;

ifstream fin("lca.in");
ofstream fout("lca.out");

vector <int> G[NMax];
int N,M;
int TT[NMax],Level[NMax];
void ReadTree()
{
    fin>>N>>M;
    for(int i=2;i<=N;i++)
        {
            fin>>TT[i];
            G[TT[i]].push_back(i);
        }
}

void DFS(int Node)
{
    for(int i=0;i<(int)G[Node].size();i++)
        {
            int Vecin = G[Node][i];
            Level[Vecin] = Level[Node] + 1;
            DFS(Vecin);
        }
}

int LCA(int x, int y)
{
    if(Level[x]<Level[y])
        swap(x,y);

    while(Level[x]!=Level[y])
        x = TT[x];

    while(x!=y)
        {
            x = TT[x];
            y = TT[y];
        }
    return x;
}

void SolveandPrint()
{
    while(M--)
    {
        int x,y;
        fin>>x>>y;
        fout<<LCA(x,y)<<"\n";
    }
}

int main()
{
    ReadTree();
    DFS(1);
    SolveandPrint();
    return 0;
}