Pagini recente » Cod sursa (job #1713179) | Cod sursa (job #2723215) | Cod sursa (job #2876460) | Cod sursa (job #154336) | Cod sursa (job #2457732)
#include <bits/stdc++.h>
#define Nmax 100005
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
vector <int> v[Nmax];
int n, l[Nmax], p[Nmax], t[Nmax], i, j, x, y, m, h, H;
void dfs(int x)
{
int i;
for(i=0;i<v[x].size();i++)
{
l[v[x][i]]=l[x]+1;
H=max(H, l[v[x][i]]);
dfs(v[x][i]);
}
}
void tata(int x)
{
if(l[x]<h)
p[x]=1;
else if(l[x]%h==0)
p[x]=t[x];
else
p[x]=p[t[x]];
int i;
for(i=0;i<v[x].size();i++)
tata(v[x][i]);
}
int intrebare(int x, int y)
{
while(p[x]!=p[y])
if(l[x]>l[y])
x=p[x];
else y=p[y];
while(x!=y)
if(l[x]>l[y])
x=t[x];
else y=t[y];
return x;
}
int main()
{
fin >> n >> m;
for(i=2;i<=n;i++)
{
fin >> t[i];
v[t[i]].push_back(i);
}
dfs(1);
h=sqrt(H);
tata(1);
for(i=1;i<=m;i++)
{
fin >> x >> y;
fout << intrebare(x, y) << '\n';
}
return 0;
}