Pagini recente » Cod sursa (job #931343) | Cod sursa (job #1805457) | Cod sursa (job #2509303) | Cod sursa (job #315798) | Cod sursa (job #2084811)
#include <iostream>
#include <fstream>
#include <vector>
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;
void df(int nod,int 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=1;i<n;i++)
{
fin>>x;
v[x].push_back(i+1);
tm[i+1]=x;
}
l=1;
df(1,l);
H=l;
dfs(1,1,1);
for(int i=1;i<=m;i++)
{
fin>>l>>p;
fout<<cautare(l,p)<<'\n';
}
return 0;
}