Pagini recente » Cod sursa (job #2742968) | Cod sursa (job #1049638) | Cod sursa (job #3251848) | Cod sursa (job #2978645) | Cod sursa (job #1911031)
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int m,n,vTati[100002];
int E[400002];
int vNiv[400002][100];
int indice=0;
int findINe(int nod)
{
for(int i=1; i<=indice; i++)
{
if(E[i]==nod)
return i;
}
}
void parcurgereEuler(int nod,int niv)
{
for(int i=1; i<=m; i++)
{
if(vTati[i]==nod)
{
E[++indice]=i;
vNiv[indice][0]=niv+1;
parcurgereEuler(i,niv+1);
E[++indice]=nod;
vNiv[indice][0]=niv;
}
}
}
void citire()
{
scanf("%d%d",&m,&n);
for(int i=2; i<=m; i++)
{
scanf("%d",&vTati[i]);
}
E[++indice]=1;
vNiv[indice][0]=0;
parcurgereEuler(1,0);
int log=log2(indice);
for(int i=1; i<=log; i++)
for(int j=1; j<=m; j++)
{
if(j+(1<<(i-1))>m)
vNiv[j][i]=vNiv[j][i-1];
else
vNiv[j][i]=min(vNiv[j][i-1],vNiv[j+(1<<(i-1))][i-1]);
}
int x,y,st,dr;
for(int i=1; i<=n; i++)
{
scanf("%d%d",&x,&y);
st=findINe(x);
dr=findINe(y);
if(st>dr)
swap(st,dr);
log=log2(dr-st+1);
int aux=min(vNiv[st][log],vNiv[dr-(1<<log)+1][log]);
for(int i=st;i<=dr;i++)
{
if(vNiv[i][0]==aux)
{
printf("%d\n",E[i]);
break;
}
}
}
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
citire();
return 0;
}