Cod sursa(job #2230641)

Utilizator shantih1Alex S Hill shantih1 Data 10 august 2018 20:49:18
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 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[200005],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";
	}
}