Pagini recente » Cod sursa (job #3160053) | Cod sursa (job #2451687) | Cod sursa (job #2717832) | Cod sursa (job #504497) | Cod sursa (job #2495311)
//#include <iostream>
#include <bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int Max=100005;
int n,m,tata[Max],gr[Max],nivel[Max];
int *v[Max];
struct muchie
{
int x,y;
}muc[Max];
void citire()
{
in>>n>>m;
for(int i=2;i<=n;i++)
{
int x; in>>x;
tata[i]=x;
gr[x]++;
muc[i-1]={x,i};
}
for(int i=1;i<=n;i++)
{
v[i]= (int *) malloc(sizeof(int)*gr[i]+2);
v[i][gr[i]]=-1;
gr[i]=0;
}
for(int i=1;i<=n-1;i++)
{
int x=muc[i].x; int y=muc[i].y;
v[x][gr[x]]=y;
gr[x]++;
}
}
void dfs(int nod,int tata=0)
{
nivel[nod]=nivel[tata]+1;
for(int *j=v[nod];*j!=-1;j++)
{
dfs(*j,nod);
}
}
int main()
{
citire();
dfs(1);
for(int i=1;i<=m;i++)
{
int x,y; in>>x>>y;
while(x!=y)
{
if(nivel[x]>nivel[y])
x=tata[x];
else
y=tata[y];
}
out<<x<<"\n";
}
return 0;
}