Pagini recente » Cod sursa (job #2363219) | Cod sursa (job #3156319) | Cod sursa (job #2230147) | Cod sursa (job #2764235) | Cod sursa (job #2841469)
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,t[100005],l[100005],P[100005][30],nr;
vector<int> v[100005];
int dfs(int nod)
{
if(nod==1)
return 0;
if(!l[nod])
l[nod]=dfs(P[nod][0])+1;
return l[nod];
}
int log(int x){
int log;
log = 0;
while(x > 1){
log++;
x>>=1;
}
return log;
}
int lca(int p,int q)
{
if(l[q]<l[p])
swap(p,q);
int j=log(l[q]-l[p]);
if(l[p]!=l[q])
{while(j>=0 && l[q]>l[p])
{
if(l[q]-(1<<j)>=l[p])
q=P[q][j];
j--;
}}
if(p==q)
return q;
for(int i=log(l[p]);i>=0;i--)
{
if(P[q][i]!=P[p][i] && P[q][i]!=0 && P[p][i]!=0)
p=P[p][i],q=P[q][i];
}
return P[p][0];
}
int main()
{
int m;
fin>>n>>m;
for(int i=2;i<=n;i++)
{
int x;
fin>>x;
P[i][0]=x;
}
for(int i=2;i<=n;i++)
l[i]=dfs(i);
for(int j=1;(1<<j)<n;j++)
{
for(int i=1;i<=n;i++)
P[i][j]=P[P[i][j-1]][j-1];
}
while(m--)
{
int p,q;
fin>>p>>q;
fout<<lca(p,q)<<"\n";
}
return 0;
}