Pagini recente » Cod sursa (job #2945578) | Cod sursa (job #1851536) | Cod sursa (job #2542624) | Cod sursa (job #1871774) | Cod sursa (job #2353857)
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int n,m,x,y;
vector <int> g[100005];
int d[100005], ap[100005];
vector <int> dp[20];
void dfs(int nod, int ad){
d[nod] = ad;
ap[nod]=dp[0].size();
dp[0].push_back(nod);
for(int i : g[nod]){
dfs(i,ad+1);
dp[0].push_back(nod);
}
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d%d", &n,&m);
for(int i=2;i<=n;++i){
scanf("%d", &x);
g[x].push_back(i);
}
dfs(1,0);
int ln = dp[0].size();
for(int i = 1; (1<<i)<=ln;++i){
for(int j = 0; j+(1<<(i-1))<ln;++j)
if(d[dp[i-1][j]]<d[dp[i-1][j+(1<<(i-1))]])
dp[i].push_back(dp[i-1][j]);
else
dp[i].push_back(dp[i-1][j+(1<<(i-1))]);
}
for(int i = 0; i < m; ++i){
scanf("%d%d", &x,&y);
x=ap[x];
y=ap[y];
if(x>y)
swap(x,y);
int k = log2(y-x+1);
if(d[dp[k][x]]<d[dp[k][y-(1<<(k))+1]])
cout<<dp[k][x];
else
cout<<dp[k][y-(1<<(k))+1];
cout<<"\n";
}
return 0;
}