Pagini recente » Cod sursa (job #936779) | Cod sursa (job #1879746) | Cod sursa (job #2186164) | Cod sursa (job #2914646) | Cod sursa (job #2286532)
#include<stdio.h>
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
#define MAXN 100000
typedef struct nod{
vector<int> fii;
vector<int> eticheta;
}nod;
nod noduri[MAXN];
int M,N;
int lca(int a,int b){
vector<int> va=noduri[a].eticheta;
vector<int> vb=noduri[b].eticheta;
int la=va.size();
int lb=vb.size();
if(la==0 || lb==0)
return 0;
int n=0;
int value=0;
while(n<la && n<lb && va[n]==vb[n]){
value=noduri[value].fii[va[n]];
n++;
}
return value;
}
int main(){
freopen("lca.in", "r", stdin);
//freopen("lca_test1.in", "r", stdin);
freopen("lca.out", "w", stdout);
scanf("%d %d", &N,&M);
int aux;
for(int i=1;i<N;i++){
scanf("%d", &aux);
noduri[i].eticheta=noduri[aux-1].eticheta;
noduri[i].eticheta.push_back(noduri[aux-1].fii.size());
noduri[aux-1].fii.push_back(i);
}
int x,y,rez;
for(int i=0;i<M;i++){
scanf("%d %d",&x,&y);
rez=lca(x-1,y-1)+1;
printf("%d\n",rez);
}
return 0;
}