Pagini recente » Cod sursa (job #122996) | Cod sursa (job #3246934) | Cod sursa (job #1937418) | Cod sursa (job #677539) | Cod sursa (job #2286487)
#include<stdio.h>
#include<iostream>
#include<fstream>
using namespace std;
typedef struct nod{
int value;
int nivel;
nod* parent;
}nod;
#define MAXN 100000
nod* noduri[MAXN];
int M,N;
int lca(nod *A,nod* B){
if(A==B)
return A->value;
if(A==noduri[0] || B==noduri[0])
return 1;
while(A->nivel > B->nivel){
A=A->parent;
}
while(B->nivel > A->nivel){
B=B->parent;
}
while(A!=B){
A=A->parent;
B=B->parent;
}
return A->value;
}
int main(){
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
scanf("%d %d", &N,&M);
noduri[0]=new nod;
noduri[0]->value=1;
noduri[0]->nivel=1;
noduri[0]->parent=NULL;
int aux;
for(int i=1;i<N;i++){
scanf("%d", &aux);
noduri[i]=new nod;
noduri[i]->value=i+1;
noduri[i]->parent=noduri[aux-1];
noduri[i]->nivel=noduri[aux-1]->nivel+1;
}
int x,y,rez;
for(int i=0;i<M;i++){
scanf("%d %d",&x,&y);
rez=lca(noduri[x-1],noduri[y-1]);
printf("%d\n",rez);
}
return 0;
}