Pagini recente » Cod sursa (job #2452001) | Cod sursa (job #2241756) | Cod sursa (job #2103666) | Cod sursa (job #2801310) | Cod sursa (job #2706027)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,dp[100005][21],in[100005],out[100005];
vector<int> muchii[100005];
int t=0;
int level[100005];
void dfs(int nod,int parent)
{
dp[nod][0]=parent;
level[nod]=level[parent]+1;
t++;
in[nod]=t;
for(int i=1;i<=20;i++)
dp[nod][i]=dp[dp[nod][i-1]][i-1];
for(auto i:muchii[nod])
dfs(i,nod);
t++;
out[nod]=t;
}
bool isparent(int a, int b)
{
return (a==b)||(level[a]<level[b]&&in[a]<in[b]&&out[a]>out[b]);
}
int lca(int a, int b)
{
if(level[a]>level[b])
swap(a,b);
if(isparent(a,b))
return a;
int p=a;
for(int i=20;i>=0;i--)
if(!isparent(dp[p][i],b)&&dp[p][i]>1)
p=dp[p][i];
return dp[p][0];
}
int main()
{
ios_base::sync_with_stdio(false);
fin.tie(0);
fout.tie(0);
fin>>n>>m;
for(int i=2;i<=n;i++)
{
int a;
fin>>a;
muchii[a].push_back(i);
}
dfs(1,0);
while(m--)
{
int a, b;
fin>>a>>b;
fout<<lca(a,b)<<'\n';
}
return 0;
}