Pagini recente » Cod sursa (job #1336164) | Cod sursa (job #814485) | Cod sursa (job #1283803) | Cod sursa (job #1883373) | Cod sursa (job #1165628)
#include<stdio.h>
#include<vector>
#include<cmath>
using namespace std;
#define nmax 100005
int n, m, i, x, y, h, dim;
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 dfs1(int x)
{
vector <int> ::iterator it;
niv[x]=niv[t[x]]+1;
if (h<niv[x])
h=niv[x];
for (it=ma[x].begin();it!=ma[x].end();it++)
dfs1(*it);
}
void dfs2(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++)
dfs2(*it,n1);
}
void 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];
}
printf("%ld\n",x);
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
citire();
dfs1(1);
dim=long(sqrt(h))+1;
dfs2(1,1);
for (i=1;i<=m;i++)
{
scanf("%ld %ld",&x,&y);
lca(x,y);
}
return 0;
}