Cod sursa(job #2084811)

Utilizator vladavladaa vlada Data 9 decembrie 2017 12:04:42
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> v[100001];
int TM[100001],tm[100001],LEV[100001],n,m,l,p,H,x;
void df(int nod,int level)
{
    for(int y=0;y<v[nod].size();y++)
        df(v[nod][y],level+1);
}
void dfs(int nod,int tata,int level)
{
    TM[nod]=tata;
    LEV[nod]=level;
    if(level%H==1)tata=nod;
    for(int y=0;y<v[nod].size();y++)
        dfs(v[nod][y],tata,level+1);
}
int cautare(int a,int b)
{
    while(TM[a]!=TM[b])
    {
        if(LEV[a]<LEV[b])
            b=TM[b];
        else
            a=TM[a];
    }
    while(a!=b)
    if(LEV[a]<LEV[b])
            b=tm[b];
        else
            a=tm[a];
    return a;
}
int main()
{
    fin>>n>>m;
    for(int i=1;i<n;i++)
    {
        fin>>x;
        v[x].push_back(i+1);
        tm[i+1]=x;
    }
    l=1;
    df(1,l);
    H=l;
    dfs(1,1,1);
    for(int i=1;i<=m;i++)
    {
        fin>>l>>p;
        fout<<cautare(l,p)<<'\n';
    }
    return 0;
}