Pagini recente » Istoria paginii utilizator/lori521 | Cod sursa (job #3361462) | Cod sursa (job #3361629)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
#define cin fin
#define cout fout
int n,m,up[100005][18],nivel[100005],x,y;
int lca(int a,int b)
{
if(nivel[a]<nivel[b])
swap(a,b);
int dif=nivel[a]-nivel[b];
for(int i=17;i>=0;i--)
if(dif&(1<<i)) a=up[a][i];
if(a==b) return a;
for(int i=17;i>=0;i--)
if(up[a][i]!=up[b][i])
{
a=up[a][i];
b=up[b][i];
}
return up[a][0];
}
int main()
{
cin>>n>>m;
up[1][0]=1;
nivel[1]=0;
for(int i=2;i<=n;i++)
{
cin>>up[i][0];
nivel[i]=nivel[up[i][0]]+1;
for(int j=1;j<=17;j++)
up[i][j]=up[up[i][j-1]][j-1];
}
while(m--)
{
cin>>x>>y;
cout<<lca(x,y)<<'\n';
}
}