Pagini recente » Cod sursa (job #549169) | Cod sursa (job #2596536) | Cod sursa (job #2806117) | Cod sursa (job #2744244) | Cod sursa (job #1092700)
#include<stdio.h>
#include<vector>
#include<cmath>
using namespace std;
#define nmax 100005
int n, m, i, x, y, h, dim, ii, hac;
int niv[nmax], t[nmax], t2[nmax];
vector <int> ma[nmax];
void citire()
{
scanf("%ld %ld",&n,&m);
for (i=2;i<=n;i++)
{
scanf("%ld",&t[i]);
ma[t[i]].push_back(i);
}
}
void dfs(int x)
{
vector <int> ::iterator it;
hac++;
niv[x]=hac;
if (h>hac)
h=hac;
for (it=ma[x].begin();it!=ma[x].end();it++)
dfs(*it);
hac--;
}
void dfs1(int x, int n1)
{
vector <int> ::iterator it;
t2[x]=n1;
if (niv[x]%dim==1)
n1=x;
for (it=ma[x].begin();it!=ma[x].end();it++)
dfs1(*it, n1);
}
int lca(int x, int y)
{
while (t2[x]!=t2[y])
if (niv[x]>niv[y])
x=t2[x];
else
y=t2[y];
while (x!=y)
if (niv[x]>niv[y])
x=t[x];
else
y=t[y];
return x;
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
citire();
dfs(1);
dim=long(sqrt(h))+1;
dfs1(1,1);
for (ii=1;ii<=m;ii++)
{
scanf("%ld %ld",&x,&y);
printf("%ld\n",lca(x,y));
}
return 0;
}