Pagini recente » Cod sursa (job #3032669) | Cod sursa (job #1097111) | Cod sursa (job #1816741) | Cod sursa (job #2362449) | Cod sursa (job #2951005)
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
const int N=1e5+5;
const int L=17;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,niv[N],up[N][L+1];
vector<int> g[N];
void dfs(int nod,int tata){
for(int i=1; i<=L; i++)
up[nod][i]=up[up[nod][i-1]][i-1];
for(auto i:g[nod])
if(i!=tata){
niv[i]=niv[nod]+1;
up[i][0]=nod;
dfs(i,nod);
}
}
int lca(int a,int b){
if(niv[a]<niv[b])
swap(a,b);
for(int i=L; i>=0; i--)
if(up[a][i] && niv[up[a][i]]>=niv[b])
a=up[a][i];
if(a==b)
return a;
for(int i=L; i>=0; i--)
if(up[a][i] && up[b][i] && up[a][i]!=up[b][i])
{
a=up[a][i];
b=up[b][i];
}
return up[a][0];
}
int main()
{
fin>>n>>m;
for(int i=2; i<=n; i++)
{
int x;
fin>>x;
g[x].pb(i);
g[i].pb(x);
}
dfs(1,0);
for(int i=1; i<=m; i++)
{
int a,b;
fin>>a>>b;
fout<<lca(a,b)<<'\n';
}
}