Pagini recente » Cod sursa (job #2755514) | Cod sursa (job #1168213) | Cod sursa (job #2080793) | Cod sursa (job #1426649) | Cod sursa (job #2079390)
#include<fstream>
#include<vector>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
#define DN 100005
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,p,q,x[DN],aux,d;
int pr[21][DN];
vector<int>v[DN];
void dfs(int nod,int nr)
{
x[nod]=nr;
for(auto i:v[nod])
dfs(i,nr+1);
}
int lc(int a,int b)
{
if(x[b]>x[a])
{
aux=a;
a=b;
b=aux;
}
d=x[a]-x[b];
for(int i=20;i>=0&&d;i--)
if((1<<i)<=d)
{
a=pr[i][a];
d-=(1<<i);
}
if(a==b)
return a;
for(int i=20;i>=0;i--)
if(pr[i][a]!=pr[i][b]&&pr[i][a])
{
a=pr[i][a];
b=pr[i][b];
}
return pr[0][a];
}
int main()
{
fin>>n>>m;
for(int i=2;i<=n;i++)
{
fin>>pr[0][i];
v[pr[0][i]].push_back(i);
}
for(int j=1;(1<<j)<=n;j++)
for(int i=1;i<=n;i++)
pr[j][i]=pr[j-1][pr[j-1][i]];
dfs(1,1);
for(int i=1;i<=m;i++)
{
fin>>p>>q;
fout<<lc(p,q)<<'\n';
}
}