Pagini recente » Cod sursa (job #1984819) | Cod sursa (job #1969261) | Cod sursa (job #169609) | Cod sursa (job #2230082) | Cod sursa (job #2111068)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in") ;
ofstream fout("lca.out") ;
vector<int> graf[100001] ;
int first[100001] ;
vector<pair<int,int> > vizit;
int n , m ;
void citire()
{
int x;
fin >> n >> m ;
first[1] = -1 ;
for ( int i = 1 ; i <= n-1 ; i++ )
{
first[i+1] = -1 ;
fin >> x ;
graf[x].push_back(i+1) ;
}
}
void DFS(int nod,int nivel)
{
vizit.push_back(make_pair(nod,nivel)) ;
if ( first[nod] == -1 )
first[nod] = vizit.size()-1 ;
for ( int i = 0 ; i < graf[nod].size() ; i++ )
{
DFS(graf[nod][i],nivel+1) ;
vizit.push_back(make_pair(nod,nivel)) ;
}
}
int main()
{
citire() ;
DFS(1,0) ;
int minim , sol , j , x , y ;
/*for ( int i = 0 ; i < vizit.size() ; i++ )
cout << vizit[i].first << " " << vizit[i].second << endl ;*/
/*for ( int i = 1 ; i <= n ; i++ )
cout << first[i] << " " ;
cout << endl ;*/
for ( int i = 1 ; i <= m ; i++ )
{
fin >> x >> y ;
minim = 100001;
for ( j = first[x] ; j <= first[y] ; j++ )
{
if ( vizit[j].second < minim )
{
minim = vizit[j].second ;
sol = vizit[j].first ;
}
}
fout << sol << '\n' ;
}
}