Cod sursa(job #429888)

Utilizator GotenAmza Catalin Goten Data 30 martie 2010 16:22:22
Problema Lowest Common Ancestor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<fstream>
#include<vector>
#define pk push_back
#define nmax 100100
using namespace std;
int eu[2*nmax],niv[2*nmax],padre[nmax],beg[nmax],rmq[17][2*nmax],lg[2*nmax];
vector <int> v[nmax];
void dfs(int nod, int nivel)
{
	eu[++eu[0]]=nod;
	niv[eu[0]]=nivel;
	beg[nod]=eu[0];	
	vector<int>::iterator fiu;
	for(fiu=v[nod].begin();fiu!=v[nod].end();fiu++)
		dfs(*fiu,nivel+1);
	if(padre[nod])
	{
		eu[++eu[0]]=padre[nod];
		niv[eu[0]]=nivel-1;
	}
}
int main()
{
	int n,m,i,t,j,x,y,l;
	ifstream f("lca.in");
	ofstream g("lca.out");
	f>>n>>m;
	for(i=2;i<=n;i++)
	{
		f>>padre[i];
		v[padre[i]].pk(i);
	}
	dfs(1,0);	
	lg[1]=0;
	for(i=2;i<=eu[0];i++)
		lg[i]=lg[i>>1]+1;
	for(i=1;i<=eu[0];i++)
		rmq[0][i]=i;
	for(j=1;j<=lg[eu[0]];j++)
		for(i=1;j<=lg[eu[0]+1-i];i++)
		{
			t=j-1;
			if(niv[rmq[t][i]]<niv[rmq[t][i+(1<<t)]])
				rmq[j][i]=rmq[t][i];
			else
				rmq[j][i]=rmq[t][i+(1<<t)];
		}
	while(m--)
	{
		f>>x>>y;
		x=beg[x];
		y=beg[y];
		if(x>y)
		{
			t=x;
			x=y;
			y=t;
		}
		l=lg[y-x+1];
		if(niv[rmq[l][x]]<niv[rmq[l][y+1-(1<<l)]])
			g<<eu[rmq[l][x]]<<'\n';
		else
			g<<eu[rmq[l][y+1-(1<<l)]]<<'\n';
	}
	return 0;
}