Pagini recente » Cod sursa (job #1972104) | Cod sursa (job #1088820) | Cod sursa (job #1698440) | Cod sursa (job #2624537) | Cod sursa (job #2368961)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
int euler[1000000],neuler=1,nivel[1000000];
struct nod
{
int fiu;
nod* next;
}*a[100005];
void dfs(int x,int niv)
{
euler[neuler]=x;
nivel[neuler++]=niv;
for (nod *i=a[x];i;i=i->next)
{
dfs(i->fiu,niv+1);
euler[neuler]=x;
nivel[neuler++]=niv;
}
}
int rez(int x,int y)
{
bool ok=false;
int nod=1,mini=2000000000,ant=-1;
for (int i=1;i<=neuler;i++)
{
if ((euler[i]==x||euler[i]==y)&&euler[i]!=ant)
{
ant=euler[i];
if (ok==true)
{
if (mini>nivel[i])
{
mini=nivel[i];
nod=euler[i];
}
break;
}
ok=true;
}
if (ok&&mini>nivel[i])
{
mini=nivel[i];
nod=euler[i];
}
}
return nod;
}
int main()
{
int n,m;
fin>>n>>m;
for(int i=1;i<n;i++)
{
int x;
fin>>x;
nod* nou=new nod;
nou->fiu=i+1;
nou->next=a[x];
a[x]=nou;
}
dfs(1,0);
for (int i=0;i<m;i++)
{
int x,y;
fin>>x>>y;
fout<<rez(x,y)<<'\n';
}
return 0;
}