Pagini recente » Cod sursa (job #828930) | Cod sursa (job #1106028) | Cod sursa (job #2902031) | Cod sursa (job #784908) | Cod sursa (job #2863468)
#include <fstream>
#include <vector>
#include <deque>
#include <algorithm>
#include <string>
#define MOD 1999999973
#define INT_MAX 1000000000
using namespace std ;
ifstream cin ("lca.in") ;
ofstream cout ("lca.out") ;
int tatal[100009], e[100009], lvl[100009], primaparitie[100009] ;
vector<int> fii[100009] ;
int peuler(int nod, int poz, int level)
{
lvl[poz] = level ;
e[poz ++] = nod ;
if(fii[nod].size())
{
for(int f = 0 ; f < fii[nod].size() ; f ++)
poz = peuler(fii[nod][f], poz, level + 1), e[poz] = nod, lvl[poz] = level, poz ++ ;
return poz ;
}
else return poz ;
}
int main()
{
int n, q ;
cin >> n >> q ;
for(int f = 2 ; f <= n ; f ++)
cin >> tatal[f], fii[tatal[f]].push_back(f) ;
/*
for(int f = 1 ; f <= n ; f ++)
{
cout << f << " " ;
for(int e = 0 ; e < fii[f].size() ; e ++)
cout << fii[f][e] << " " ;
cout << endl ;
}
*/
int neuler = peuler(1, 1, 0) - 1 ;
for(int f = 1 ; f <= neuler ; f ++)
if(!primaparitie[e[f]])primaparitie[e[f]] = f ;
while(q --)
{
int st, dr, a, b, mn = INT_MAX ;
cin >> a >> b ;
st = primaparitie[a] ;
dr = primaparitie[b] ;
if(st > dr)swap(st, dr) ;
mn = st ;
while(st <= dr)
{
if(lvl[st] < lvl[mn])mn = st ;
st ++ ;
}
cout << e[mn] << '\n' ;
}
return 0 ;
}