Cod sursa(job #563944)

Utilizator ProcopliucProcopliuc Adrian Procopliuc Data 26 martie 2011 13:48:16
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
# include <fstream>
# define nmax 100005
using namespace std;
ifstream f ("lca.in");
ofstream g ("lca.out");
int eul[2*nmax],niv[2*nmax],pr[2*nmax],n,m,i,x,nivel,k,q,v[20][2*nmax],lg[2*nmax],y,mm,aux;
struct nod
{
	int info;
	nod*urm;
}*p,*a[nmax];

  
  void df (int x)
  {
	 
	  nod *p=a[x];
	  pr[x]=k+1;
	  while (p)
	  {
		k++;
	    eul[k]=x;
	    niv[k]=nivel;
		
		nivel++;
		df (p->info);
		p=p->urm;
	  }
	  
	  k++;
	    eul[k]=x;
	    niv[k]=nivel;
	  nivel--;
  }


  void rmq ()
  {
	  int i,j;
	  m=2*n-1;
  for (i=2;i<=m;i++)
		lg[i]=lg[i/2]+1;
  
  for (i=1;i<=m;i++)
	  v[0][i]=i;
  
  for (j=1;j<=lg[m];j++)
		for (i=1;(k=i+(1<<j-1))<=m;i++)
			if (niv[v[j-1][i]]<niv[v[j-1][k]])
				v[j][i]=v[j-1][i];
			else
				v[j][i]=v[j-1][k];
  }

  int rmq2 (int x,int y)
  {
	  if (x>y)
	  {
		  aux=x;
		  x=y;
		  y=aux;
		  
	  }
		  q=lg[y-x+1];
		if (niv[v[q][x]]<niv[v[q][(y-(1<<q))+1]])
			return v[q][x];
		else
			return v[q][(y-(1<<q))+1];
  }
  
int main ()
{
	f>>n>>mm;
	for (i=2;i<=n;i++)
	{
		f>>x;
		p=new nod;
		p->info=i;
		p->urm=a[x];
		a[x]=p;
	}
	nivel=0;
	df (1);
	rmq ();
	for (i=1;i<=mm;i++)
	{
		f>>x>>y;
		g<<eul[rmq2(pr[x],pr[y])]<<"\n";
	}
	return 0;
}