Pagini recente » Cod sursa (job #2481317) | Cod sursa (job #290845) | Cod sursa (job #938210) | Cod sursa (job #2834525) | Cod sursa (job #2151351)
#include <bits/stdc++.h>
#define INFILE "lca.in"
#define OUTFILE "lca.out"
using namespace std;
ifstream in(INFILE);
ofstream out(OUTFILE);
const int NMAX=100010;
const int LOGNMAX=23;
typedef array<int,NMAX> vec;
typedef array<array<int,LOGNMAX>,NMAX> vec2;
void Procesare(vec2& P,vec& T,int N){
for(int i=0;i<N;i++){
for(int j=0;(1<<j)<N;j++){
P[i][j]=-1;
}
}
for(int i=0;i<N;i++){
P[i][0]=T[i];
}
for(int j=1;(1<<j)<N;j++){
for(int i=0;i<N;i++){
if(P[i][j-1]!=-1){
P[i][j]=P[P[i][j-1]][j-1];
}
}
}
}
int Query(vec& L,vec& T,vec2& P,int N, int p, int q){
int lg;
if(L[p]<L[q])
swap(p,q);
for(lg=1;(1<<lg)<=L[p];lg++);
lg--;
//cout<<lg<<"\n";
for(int i=lg;i>=0;i--){
if(L[p]-(1<<i)>=L[q])
p=P[p][i];
}
if(p==q)
return q;
for(int i=lg;i>=0;i--){
if(P[p][i]!=-1&&P[p][i]!=P[q][i]){
p=P[p][i];
q=P[q][i];
}
}
return T[p];
}
vec T;
vec2 P;
vec L;
int N,M;
void Read(){
in>>N>>M;
for(int i=2;i<=N;i++){
int x;
in>>x;
T[i-1]=x-1;
L[i-1]=1+L[x-1];
}
}
void Determinare(){
Procesare(P,T,N);
/*for(int i=0;i<N;i++)
cout<<i<<": "<<T[i]<<" "<<L[i]<<"\n";*/
//cout<<Query(L,T,P,N,9,10)<<"\n";
for(int i=1;i<=M;i++){
int x,y;
in>>x>>y;
out<<Query(L,T,P,N,x-1,y-1)+1<<"\n";
}
}
int main(){
Read();
Determinare();
}