Pagini recente » Cod sursa (job #956488) | Cod sursa (job #1964599) | Cod sursa (job #2270270) | Cod sursa (job #2529114) | Cod sursa (job #1562965)
#include<cstdio>
#define N 100000
#define P 17
using namespace std;
int stra[P][N+1];
int nivel[N+1];
void afla(int i){
if (nivel[i]==0){
afla(stra[0][i]);
nivel[i]=nivel[stra[0][i]]+1;
}
}
int adu(int x,int niv){
int p;
for(p=16;p>=0;p--)
if (nivel[stra[p][x]]>=niv) x=stra[p][x];
return x;
}
int lca(int x,int y){
if (nivel[x]>nivel[y]) x=adu(x,nivel[y]);
else y=adu(y,nivel[x]);
int p;
for(p=16;p>=0;p--)
if (stra[p][x]!=stra[p][y]){
x=stra[p][x];
y=stra[p][y];
}
if (x!=y) x=stra[0][x];
return x;
}
int main(){
freopen ("lca.in","r",stdin);
freopen ("lca.out","w",stdout);
int n,m,i,j,x,y;
scanf ("%d%d",&n,&m);
for(i=2;i<=n;i++)
scanf ("%d",&stra[0][i]);
for(i=1;i<P;i++)
for(j=2;j<=n;j++)
stra[i][j]=stra[i-1][stra[i-1][j]];
nivel[1]=1;
for(i=2;i<=n;i++)
if (nivel[i]==0) afla(i);
for(i=1;i<=m;i++){
scanf ("%d%d",&x,&y);
printf ("%d\n",lca(x,y));
}
return 0;
}