Cod sursa(job #2084830)

Utilizator vladavladaa vlada Data 9 decembrie 2017 12:12:22
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>

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,lg;
void df(int nod,int level)
{
    lg=max(lg,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=2;i<=n;i++)
        fin>>tm[i];
    for(int i=1;i<n;i++)
    {
        v[tm[i+1]].push_back(i+1);
    }
    df(1,1);
    H=sqrt(lg);
    dfs(1,1,1);
    for(int i=1;i<=m;i++)
    {
        fin>>l>>p;
        fout<<cautare(l,p)<<'\n';
    }
    return 0;
}