Pagini recente » Cod sursa (job #2405424) | Cod sursa (job #2917181) | Cod sursa (job #2798320) | Cod sursa (job #2503884) | Cod sursa (job #1414101)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
#include<set>
#include<map>
#include<cmath>
#include<climits>
using namespace std ;
#define maxn 100005
#define H 100
int N, M ;
vector<int> graf[maxn] ;
int nivel[maxn], T[maxn], T2[maxn] ;
bool sel[maxn] ;
void dfs(int nod, int tata, int level)
{
sel[nod] = true ;
nivel[nod] = level ;
T2[nod] = tata ;
if( level % H == 0 )
tata = nod ;
for(size_t i = 0; i < graf[nod].size(); ++i)
{
int vecin = graf[nod][i] ;
if( sel[vecin] == false )
dfs( vecin, tata, level + 1 ) ;
}
}
int main()
{
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
scanf("%d%d", &N, &M);
for(int i = 1; i < N; ++i)
{
int x ;
scanf("%d", &x);
graf[x].push_back(i + 1) ;
graf[i + 1].push_back(x) ;
T[i + 1] = x ;
}
dfs(1, 1, 0) ;
for(int i = 1; i <= M; ++i)
{
int x, y ;
scanf("%d%d", &x, &y);
while( T2[x] != T2[y] )
{
if( nivel[x] > nivel[y] )
x = T2[x] ;
else
y = T2[y] ;
}
while( x != y )
{
if( nivel[x] > nivel[y] )
x = T[x] ;
else
y = T[y] ;
}
printf("%d\n", x);
}
return 0 ;
}