Cod sursa(job #2230562)

Utilizator shantih1Alex S Hill shantih1 Data 10 august 2018 16:54:27
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");

int n,m,i,j,x,r,a,b;
int ne,E[200010],P[100005],M[20][200015],k[100005],H[200005];
vector<int> adia[100005];

void peuler(int nd,int h)
{
	E[++ne]=nd;
	H[ne]=h;
	for(auto i: adia[nd])
	{
		peuler(i,h+1);
		E[++ne]=nd;
		H[ne]=h;
	}
}

int main() {
	
	fin>>n>>m;
	for(i=2;i<=n;i++)
	{
		fin>>j;
		adia[j].push_back(i);
	}
	
	peuler(1,1);
	k[0]=-1;
	for(i=1;i<=ne;i++)
	{
		if(P[E[i]]==0)	P[E[i]]=i;
		M[0][i]=i;
		k[i]=k[i-1];
		if((i&(i-1))==0)	k[i]++;
	}
	
	for(j=1;j<=k[ne];j++)
		for(i=1;i<=ne-(1<<j)+1;i++)
		{
			M[j][i]=M[j-1][i+(1<<(j-1))];
			if(H[M[j-1][i]]<H[M[j][i]])	M[j][i]=M[j-1][i];
		}
	
	while(m--)
	{
		fin>>i>>j;
		if(P[i]>P[j])	{	x=i;	i=j;	j=x;	}
		x=P[j]-P[i]+1;
		a=M[k[x]][P[i]];
		r=M[k[x]][P[j]-(1<<k[x])+1];
		if(H[a]<H[r])	r=a;
		fout<<E[r]<<"\n";
	}
}