Pagini recente » Cod sursa (job #2696343) | Cod sursa (job #2845081) | Cod sursa (job #1592905) | Cod sursa (job #3000276) | Cod sursa (job #2412810)
#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' ;
}
}