Cod sursa(job #2122071)

Utilizator vancea.catalincatalin vancea.catalin Data 4 februarie 2018 16:43:53
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
fstream fin("lca.in",ios::in), fout("lca.out",ios::out);
int n,m,niv[100100],dp[20][100100];
vector<int> V[100100];

void dfs(int nod,int nivel)
{
	niv[nod]=nivel;
	for(auto x: V[nod])
	{
		dfs(x,nivel+1);
	}
}

int salt(int nod,int pas)
{
	int pow=0;
	while(pas!=0)
	{
		if((pas&1)==1)
		{
			//sar cu 2^pow
			nod=dp[pow][nod];	
		}
		pow++;
		pas=(pas>>1);
	}
	return nod;
}

int lca(int u,int v)
{
	if(niv[u]>niv[v]) swap(u,v);
	v=salt(v,(niv[v]-niv[u]));
	//aici: niv[u]==niv[v]
		
	int a,b,ind=17;
	
	if(u==v) return u;
	
	while(ind>=0)
	{
		a=salt(u,(1<<ind));
		b=salt(v,(1<<ind));
		if(a!=b)
		{
			u=a;
			v=b;
		}
		ind--;
	}
	
	return dp[0][u];
}


int main()
{
	int i,j,t,u,v;
	fin>>n>>m;
	for(i=2;i<=n;i++)
	{
		fin>>t;
		dp[0][i]=t;
		V[t].push_back(i);
	}
	dfs(1,1);
	
	for(i=1;(1<<i)<=n;i++)
	{
		for(j=2;j<=n;j++)
		{
			dp[i][j]=dp[i-1][dp[i-1][j]];
		}
	}
	
	for(i=1;i<=m;i++)
	{
		fin>>u>>v;
		
		fout<<lca(u,v)<<"\n";
		
	}
}