Cod sursa(job #2412810)

Utilizator liviu2000Dragomirescu Liviu liviu2000 Data 22 aprilie 2019 16:11:34
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <bits/stdc++.h>
#define N 100005

using namespace std;

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

vector<int> graf[N] ;
int lvl[N] ;
int pr[N][20] ;

void dfs(int nod,int tt)
{
    lvl[nod] = lvl[tt]+1 ;
    pr[nod][0] = tt ;
    for ( int i = 1 ; i <= 16 ; i++ )
        pr[nod][i] = pr[pr[nod][i-1]][i-1] ;
    for ( auto vec : graf[nod] )
        dfs(vec,nod) ;
}

int lca(int x,int y)
{
    if ( lvl[x] < lvl[y] )
        swap(x,y) ;
    int i ;
    for ( i = 16 ; i >= 0 ; i-- )
        if ( lvl[pr[x][i]] >= lvl[y] )
            x = pr[x][i] ;
    for ( i = 16 ; i >= 0 ; i-- )
        if ( pr[x][i] != pr[y][i] )
            x = pr[x][i] , y=pr[y][i] ;
    if ( x == y )
        return x;
    return pr[y][0] ;
}

int main()
{
    int n , m , x , y , i ;
    fin >> n >> m ;
    for ( i = 2 ; i <= n ; i++ )
        fin >> x , graf[x].push_back(i) ;
    dfs(1,0);
    for ( i = 1 ; i <= m ; i++ )
    {
        fin >> x >> y ;
        fout << lca(x,y) << '\n' ;
    }
}