Pagini recente » Cod sursa (job #2397286) | Cod sursa (job #3213605) | Cod sursa (job #2102995) | Cod sursa (job #312177) | Cod sursa (job #2884250)
#include<bits/stdc++.h>
using namespace std;
const int NMAX=300005;
int l[NMAX],r[NMAX],viz[NMAX];
vector<int>edge[NMAX];
int cnt=0,k;
int up[NMAX][20];
void dfs(int v,int p)
{
l[v]=++cnt;
up[v][0]=p;
for(int i=1;i<=k;i++)
up[v][i]=up[up[v][i-1]][i-1];
for(auto it:edge[v])
if(it!=p)dfs(it,v);
r[v]=++cnt;
}
bool is_anc(int u ,int v)
{
if(l[u]<=l[v] && r[u]>=r[v]) return 1;
return 0;
}
int lca(int u,int v)
{
if(is_anc(u,v))return u;
if(is_anc(v,u))return v;
for(int i=k;i>=0;--i)
if(!is_anc(up[u][i],v))
u=up[u][i];
return up[u][0];
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
int n,m,nr,i,a,b;
cin>>n>>m;
for(i=2;i<=n;i++)
{
cin>>nr;
edge[nr].push_back(i);
}
k=ceil(log2(n));
dfs(1,1);
for(i=1;i<=m;i++)
{
cin>>a>>b;
cout<<lca(a,b)<<"\n";
}
}