Cod sursa(job #2848279)

Utilizator LXGALXGA a LXGA Data 12 februarie 2022 12:13:12
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define uint unsigned int
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
int n,m,x,y;
vector<int> g[100001];
vector<pair<int,int>> v;
int first[100001],lg[200001];
pair<int,int> dp[18][200001];
void dfs(int nod,int d,int t)
{
	first[nod]=v.size();
	v.push_back({nod,d});
	for(auto i:g[nod])
	{
		if(i==t) continue;
		dfs(i,d+1,nod);
		v.push_back({nod,d});
	}
}
int main()
{
	ios_base::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<n;i++)
	{
		cin>>x;
		g[i+1].push_back(x);
		g[x].push_back(i+1);
	}
	dfs(1,0,0);
	
	for(uint i=2;i<=v.size();i++)
		lg[i]=lg[i/2]+1;
	for(uint i=0;i<v.size();i++)
	{
		dp[0][i].first=v[i].second;
		dp[0][i].second=v[i].first;
	}
	for(int j=1;j<=lg[v.size()];j++)
	{
		for(uint i=0;i+(1<<(j-1))<v.size();i++)
			dp[j][i]=min(dp[j-1][i],dp[j-1][i+(1<<(j-1))]);
	}

	for(int i=1;i<=m;i++)
	{
		cin>>x>>y;
		x=first[x],y=first[y];
		if(x>y) swap(x,y);
		int j=lg[y-x+1];
		if(dp[j][x].first<dp[j][y-(1<<j)+1].first)
			cout<<dp[j][x].second<<'\n';
		else 
			cout<<dp[j][y-(1<<j)+1].second<<'\n';
	}
	return 0;
}