Pagini recente » Cod sursa (job #1722912) | Cod sursa (job #1265014) | Cod sursa (job #1499348) | Cod sursa (job #2650736) | Cod sursa (job #2084830)
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> v[100001];
int TM[100001],tm[100001],LEV[100001],n,m,l,p,H,x,lg;
void df(int nod,int level)
{
lg=max(lg,level);
for(int y=0;y<v[nod].size();y++)
df(v[nod][y],level+1);
}
void dfs(int nod,int tata,int level)
{
TM[nod]=tata;
LEV[nod]=level;
if(level%H==1)tata=nod;
for(int y=0;y<v[nod].size();y++)
dfs(v[nod][y],tata,level+1);
}
int cautare(int a,int b)
{
while(TM[a]!=TM[b])
{
if(LEV[a]<LEV[b])
b=TM[b];
else
a=TM[a];
}
while(a!=b)
if(LEV[a]<LEV[b])
b=tm[b];
else
a=tm[a];
return a;
}
int main()
{
fin>>n>>m;
for(int i=2;i<=n;i++)
fin>>tm[i];
for(int i=1;i<n;i++)
{
v[tm[i+1]].push_back(i+1);
}
df(1,1);
H=sqrt(lg);
dfs(1,1,1);
for(int i=1;i<=m;i++)
{
fin>>l>>p;
fout<<cautare(l,p)<<'\n';
}
return 0;
}