Pagini recente » Cod sursa (job #1887357) | Cod sursa (job #2497389) | Cod sursa (job #267802) | Cod sursa (job #3154337) | Cod sursa (job #3266181)
#include <iostream>
#include <fstream>
#include <vector>
#include <list>
using namespace std;
int depth[100005];
int dp[100005][21];
vector<int> V[100005];
void dfs(int x)
{
for(auto a:V[x])
{
depth[a]=depth[x]+1;
dfs(a);
}
}
int lca(int x,int y)
{
if(depth[x]<depth[y])
swap(x,y);
for(int i=19;i>=0;i--)
if(depth[x]-(1<<i)>=depth[y])
x=dp[x][i];
if(x==y)
return x;
for(int i=19;i>=0;i--)
if(dp[x][i]!=dp[y][i])
{
x=dp[x][i];
y=dp[y][i];
}
return dp[x][0];
}
int main()
{
ifstream fin("lca.in");
ofstream fout("lca.out");
int n,m,a,x,y;
fin>>n>>m;
for(int i=2;i<=n;i++)
{
fin>>a;
V[a].push_back(i);
dp[i][0]=a;
}
dfs(1);
for(int j=1;j<=19;j++)
for(int i=1;i<=n;i++)
dp[i][j]=dp[ dp[i][j-1] ][j-1];
for(int i=1;i<=m;i++)
{
fin>>x>>y;
fout<<lca(x,y)<<'\n';
}
return 0;
}