Pagini recente » Cod sursa (job #678476) | Cod sursa (job #539324) | Cod sursa (job #2042303) | Cod sursa (job #2746978) | Cod sursa (job #933153)
Cod sursa(job #933153)
#include<cstdio>
#include<vector>
using namespace std;
#define MAX 100001
#define pb push_back
int N ,M , T[MAX] , Lev[MAX] , up[MAX];
vector<int>G[MAX] ;
void DF(int nod,int lev,int niv)
{
Lev[nod] = lev;
up[nod] = niv;
if(niv%200==0)niv = nod;
for(int j = 0 ; j < (int)G[nod].size() ; ++j )
DF(G[nod][j],lev+1,niv);
}
int main()
{
int x , y;
freopen("lca.in" , "r" , stdin );
freopen("lca.out" , "w" , stdout );
scanf("%d%d" , &N , &M );
for(int i = 2 ; i <= N ; ++i )
{scanf("%d" , &T[i]);
G[T[i]].pb(i);}
DF(1,0,0);
for(int i = 1 ; i <= M ; ++i )
{
scanf("%d%d" , &x , &y );
while(x != y)
if(Lev[x] > Lev[y])
x = T[x];
else
y = T[y];
printf("%d\n" , x);
}
return 0;
}