Pagini recente » Cod sursa (job #610852) | Cod sursa (job #100109) | Cod sursa (job #3176320) | Cod sursa (job #2364328) | Cod sursa (job #1980797)
#include <stdio.h>
#include <stdlib.h>
int nod[100001],next[100001],lista[100001],e[200001],niv[200001],log[200001],nr;
int rmq[200001][21],aux[200001][21],ap[100001];
void euler(int x,int k)
{
int z;
e[++nr]=x;
niv[nr]=k;
z=lista[x];
while(z)
{
euler(nod[z],k+1);
e[++nr]=x;
niv[nr]=k;
z=next[z];
}
}
void add(int x,int y)
{
nr++;
next[nr]=lista[x];
nod[nr]=y;
lista[x]=nr;
}
int main()
{
int n,m,i,x,j,a,b,r,l;
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=2; i<=n; i++)
{
scanf("%d",&x);
add(x,i);
}
for(i=2; i<=2*n; i++)
log[i]=log[i/2]+1;
nr=0;
euler(1,1);
for(i=1; i<=2*n; i++)
rmq[i][0]=niv[i],aux[i][0]=e[i];
for(i=1; i<=2*n; i++)
for(j=1; j<=log[i]; j++)
if(rmq[i][j-1]<rmq[i-(1<<(j-1))][j-1])
rmq[i][j]=rmq[i][j-1],aux[i][j]=aux[i][j-1];
else
rmq[i][j]=rmq[i-(1<<(j-1))][j-1],aux[i][j]=aux[i-(1<<(j-1))][j-1];
for(i=1; i<=2*n; i++)
if(ap[e[i]]==0)
ap[e[i]]=i;
for(i=1; i<=m; i++)
{
scanf("%d%d",&a,&b);
if(ap[a]>ap[b])
{
r=a;
a=b;
b=r;
}
l=log[ap[b]-ap[a]+1];
if(rmq[ap[a]+(1<<l)-1][l]<rmq[ap[b]][l])
printf("%d\n",aux[ap[a]+(1<<l)-1][l]);
else
printf("%d\n",aux[ap[b]][l]);
}
return 0;
}