Pagini recente » Cod sursa (job #778941) | Cod sursa (job #2445771) | Cod sursa (job #2782844) | Cod sursa (job #1651814) | Cod sursa (job #2306593)
#include<cstdio>
const int N=100001;
int n,m,x,y,i,j,g,t,a[N],p[N][19],l[N];
int main()
{
freopen("lca.in","r",stdin),freopen("lca.out","w",stdout),scanf("%d%d",&n,&m),l[1]=1;
for(i=2;i<=n;i++)
scanf("%d",a+i),l[i]=l[a[i]]+1,p[i][0]=a[i];
for(i=0;i<=n;i++)
for(j=1;j<19;j++)
p[i][j]=-1;
for(j=1;j<19;j++)
for(i=0;i<=n;i++)
if(p[i][j-1]!=-1)
p[i][j]=p[p[i][j-1]][j-1];
while(m--)
{
scanf("%d%d",&x,&y);
if(l[x]<l[y])
x^=y^=x^=y;
for(g=1;(1<<g)<=l[x];g++);
for(i=--g;i>=0;i--)
if(l[x]-(1<<i)>=l[y])
x=p[x][i];
if(x==y)
printf("%d\n",x);
else
{
for(i=g;i>=0;i--)
if(p[x][i]!=-1&&p[x][i]!=p[y][i]&&p[y][i]!=-1)
x=p[x][i],y=p[y][i];
printf("%d\n",a[x]);
}
}
}