Cod sursa(job #1166265)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 3 aprilie 2014 13:32:44
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
const int LMAX = 20;
const int NMAX = 100005;
vector <int> v[NMAX];
int a[LMAX+1][4*NMAX+1],niv[4*NMAX+1],p[4*NMAX+1],k,poz[4*NMAX+1],lg[4*NMAX+1];
void dfs(int nod, int lev)
{
	p[++k]=nod;
	niv[k]=lev;
	poz[nod]=k;
	for(vector <int> :: iterator it=v[nod].begin();it!=v[nod].end();it++) {
		dfs(*it,lev+1);
		p[++k]=nod;
		niv[k]=lev;
	}
}
int lca(int i, int j)
{
	int l;
	if(i>j)
		swap(i,j);
	l=lg[j-i+1];
	if(niv[a[l][i]]<niv[a[l][j-(1<<l)+1]])
		return a[l][i];
	else return a[l][j-(1<<l)+1];
}
int main ()
{
	int n,m,i,j,x,y;
	ifstream f("lca.in");
	ofstream g("lca.out");
	f>>n>>m;
	for(i=2;i<=n;i++) {
		f>>x;
		v[x].push_back(i);
	}
	dfs(1,0);
	n=k;
	lg[1]=0;
	for(i=2;i<=n;i++)
		lg[i]=lg[i/2]+1;
	for(i=1;i<=n;i++)
		a[0][i]=i;
	for(i=1;(1<<i)<=n;i++)
		for(j=1;j<=n-(1<<i)+1;j++) {
			a[i][j]=a[i-1][j];
			if(niv[a[i][j]]>niv[a[i-1][j+(1<<(i-1))]])
				a[i][j]=a[i-1][j+(1<<(i-1))];
		}
	for(i=1;i<=m;i++) {
		f>>x>>y;
		j=lca(poz[x],poz[y]);
		g<<p[j]<<'\n';
	}
	f.close();
	g.close();
	return 0;
}