Pagini recente » Cod sursa (job #545352) | Cod sursa (job #112787) | Cod sursa (job #859787) | Cod sursa (job #104371) | Cod sursa (job #1913195)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
using namespace std;
int m,n;
int E[300002],ap[100002];
int vNiv[300002];
int rmq[300002][50];
int indice=0;
vector <int> A[100002];
void parcurgereEuler(int nod,int niv)
{
for(vector <int>:: iterator IT=A[nod].begin(); IT!=A[nod].end(); IT++)
{
if(!ap[*IT])
ap[*IT]=indice+1;
E[++indice]=*IT;
vNiv[indice]=niv+1;
parcurgereEuler(*IT,niv+1);
E[++indice]=nod;
vNiv[indice]=niv;
}
}
void citire()
{
scanf("%d%d",&m,&n);
int aux;
for(int i=2; i<=m; i++)
{
scanf("%d",&aux);
A[aux].push_back(i);
}
ap[1]=1;
E[++indice]=1;
vNiv[indice]=0;
parcurgereEuler(1,0);
int log=log2(indice);
for(int i=1; i<=indice; i++)
{
rmq[i][0]=i;
}
for(int i=1; i<=log; i++)
for(int j=1; j<=indice; j++)
{
rmq[j][i]=rmq[j][i-1];
if(vNiv[rmq[j][i-1]]>vNiv[rmq[j+(1<<(i-1))][i-1]]&&(j+(1<<(i-1))<=indice))
rmq[j][i]=rmq[j+(1<<(i-1))][i-1];
}
int x,y,st,dr;
for(int i=1; i<=n; i++)
{
scanf("%d%d",&x,&y);
st=ap[x];
dr=ap[y];
if(st>dr)
swap(st,dr);
log=log2(dr-st+1);
if(vNiv[rmq[st][log]]<vNiv[rmq[dr-(1<<log)+1][log]])
printf("%d\n",E[rmq[st][log]]);
else
printf("%d\n",E[rmq[dr-(1<<log)+1][log]]);
}
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
citire();
/*for(int i=1;i<=indice;i++)
cout<<E[i]<<" ";
cout<<endl;
for(int i=1;i<=indice;i++)
cout<<vNiv[i]<<" ";
cout<<endl;
for(int i=1;i<=m;i++)
cout<<ap[i]<<" ";
*/
return 0;
}