Pagini recente » Cod sursa (job #1728262) | Cod sursa (job #1073469) | Cod sursa (job #1378068) | Cod sursa (job #1074047) | Cod sursa (job #1144943)
#include <cstdio>
using namespace std;
struct nod
{
int x;
nod *u;
};
nod *arb[100001];
int a[200001],poz[100001],ad[100001],nr;
void add(int i,int x)
{
nod *q=new nod;
ad[i]=ad[x]+1;
q->x=i;
q->u=arb[x];
arb[x]=q;
}
void eulerizare(int x)
{
a[nr]=x;
if (poz[x]==0)
poz[x]=nr;
++nr;
while(arb[x]!=NULL)
{
eulerizare(arb[x]->x);
a[nr]=x;
++nr;
arb[x]=arb[x]->u;
}
}
int lca(int x,int y)
{
int i,mix=ad[x],stix=x;
for(i=poz[x]+1;i>=poz[y];--i)
if (mix>ad[a[i]]) {
mix=ad[a[i]];
stix=a[i];
}
return stix;
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
int n,m,i,x,y;
scanf("%d%d",&n,&m);
ad[1]=0;
for(i=2;i<=n;++i)
{
scanf("%d",&x);
add(i,x);
}
eulerizare(1);
while(m!=0)
{
scanf("%d%d",&x,&y);
printf("%d\n",lca(x,y));
--m;
}
return 0;
}