Cod sursa(job #1389735)

Utilizator andreiulianAndrei andreiulian Data 16 martie 2015 16:33:27
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include<iostream>
#include<fstream>
#include<cmath>
#include<vector>
#define pb push_back
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int n,m,t[100005],T2[100005],h,nn[100005];
vector<int> v[100005];
int adancime(int i);
int lca(int x, int y);
void df(int i,int t2,int niv);
int main()
{
	in>>n>>m;
	int i,a,b;
	for(i=2;i<=n;++i)
	{
		in>>a;
		v[a].pb(i);
		t[i]=a;
	}
	h=sqrt(adancime(1));
	df(1,0,1);
	while(m--)
	{
		in>>a>>b;
		out<<lca(a,b)<<'\n';
	}
}
int lca(int x, int y)
{
	while(T2[x]!=T2[y])
	{
		if(nn[x]>nn[y]) x=T2[x];
		else y=T2[y];
	}
	while(x!=y)
	{
		if(nn[x]>nn[y]) x=t[x];
		else y=t[y];
	}
	return x;
}
void df(int i,int t2,int niv)
{
     if(niv%h==0) t2=t[i];
     nn[i]=niv;
     T2[i]=t2;
     vector<int> :: iterator it;
     for(it=v[i].begin();it!=v[i].end();++it)
     {
		df(*it,t2,niv+1);
     }
}
int adancime(int i)
{
	int r=0,a;
	vector<int> :: iterator it;
	for(it=v[i].begin();it!=v[i].end();++it)
	{
		a=adancime(*it);
		if(r<a) r=a;
	}
	return r+1;
}