Cod sursa(job #2977257)

Utilizator LXGALXGA a LXGA Data 11 februarie 2023 10:07:04
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.88 kb
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
int n,m,a,b,k;
int up[100001][18],tin[100001],tout[100001];
vector<int> g[100001];
void dfs(int nod,int p)
{
	tin[nod]=++k;
	for(int i=1;i<=16;i++)
		up[nod][i]=up[up[nod][i-1]][i-1];
	for(int i:g[nod])
	{
		if(i!=p)
			dfs(i,nod);
	}
	tout[nod]=++k;
}
bool isancest(int x,int y)
{
	return tin[x]<=tin[y] && tout[x]>=tout[y];
}
int lca(int x,int y)
{
	if(isancest(x,y))
		return x;
	if(isancest(y,x))
		return y;
	for(int i=16;i>=0;i--)
	{
		if(!isancest(up[x][i],y))
			x=up[x][i];
	}
	return up[x][0];
}
int main()
{
	ios_base::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=2;i<=n;i++)
	{
		cin>>up[i][0];
		g[i].push_back(up[i][0]);
		g[up[i][0]].push_back(i);
	}
	dfs(1,0);
	tout[0]=1e9;
	int a,b;
	while(m--)
	{
		cin>>a>>b;
		cout<<lca(a,b)<<'\n';
	}
	return 0;
}