Pagini recente » Cod sursa (job #2689857) | Cod sursa (job #2781025) | Cod sursa (job #2273563) | Cod sursa (job #2819863) | Cod sursa (job #2374413)
#include <bits/stdc++.h>
using namespace std;
#define LMAX 100005
vector<int> G[LMAX];
int n,T[LMAX][20];
int Niv[LMAX];
void dfs(int nod,int niv){
Niv[nod]=niv;
for(auto it : G[nod])
dfs(it,niv+1);
}
void precalc(){
for(int j=1;(1<<j)<=n;++j)
for(int i=1;i<=n;++i)
T[i][j]=T[T[i][j-1]][j-1];
}
int lca(int a,int b){
if(Niv[a]>Niv[b])
swap(a,b);
int log2_a=0,log2_b=0;
for(;(1<<log2_a)<=Niv[a];++log2_a)
for(;(1<<log2_b)<=Niv[b];++log2_b);
for(;log2_b>=0;--log2_b)
if(Niv[b]-(1<<log2_b)>=Niv[a])
b=T[b][log2_b];
if(a==b)
return a;
for(;log2_a>=0;--log2_a)
if(T[a][log2_a]!=0&&T[a][log2_a]!=T[b][log2_a]){
a=T[a][log2_a];
b=T[b][log2_b];
}
return T[a][0];
}
int main(){
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
int q;
scanf("%d %d",&n,&q);
for(int i=2;i<=n;++i){
scanf("%d",&T[i][0]);
G[T[i][0]].push_back(i);
}
dfs(1,0);
precalc();
while(q--){
int x,y;
scanf("%d %d",&x,&y);
printf("%d\n",lca(x,y));
}
return 0;
}