Pagini recente » Cod sursa (job #2808167) | Solutii preONI 2007, Runda 4 | Cod sursa (job #2749523) | Cod sursa (job #2505622) | Cod sursa (job #2376581)
#include <bits/stdc++.h>
#define N 100005
using namespace std;
ifstream fin("lca.in") ;
ofstream fout("lca.out") ;
int n , m ;
int tt[N] , lvl[N] ;
vector<int> graf[N] ;
void citire()
{
int i ;
fin >> n >> m ;
for ( i = 1 ; i < n ; i++ )
{
fin >> tt[i+1] ;
graf[tt[i+1]].push_back(i+1) ;
}
}
void dfs(int nod)
{
for ( auto vec : graf[nod] )
{
lvl[vec] = lvl[nod]+1 ;
dfs(vec) ;
}
}
int lca(int x,int y)
{
if ( lvl[x] < lvl[y] )
swap(x,y) ;
while ( lvl[x] != lvl[y] )
x = tt[x] ;
while ( x != y )
{
x = tt[x] ;
y = tt[y] ;
}
return x;
}
int main()
{
int i , x , y ;
citire() ;
dfs(1) ;
for ( i = 1 ; i <= m ; i++ )
{
fin >> x >> y ;
fout << lca(x,y) << '\n' ;
}
}