Cod sursa(job #703752)

Utilizator deividFlorentin Dumitru deivid Data 2 martie 2012 14:13:32
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<stdio.h>
#include<vector>

#define maxn 100005
#define maxlog 19
#define pb push_back

using namespace std;

FILE*f=fopen("lca.in","r");
FILE*g=fopen("lca.out","w");

int n,q,p;
int rmq[maxlog][maxn<<1],Eul[maxn<<1],Fap[maxn],Niv[maxn<<1],E[maxn<<1];
vector<int>G[maxn];

inline void citire () {
	
	fscanf(f,"%d %d",&n,&q);
	
	int t;
	for ( int i = 2 ; i <= n ; ++i ){
		fscanf(f,"%d",&t);
		G[t].pb(i);
	}
}

void dfs ( int nod , int niv ){
	Eul[++p] = nod; Niv[p] = niv;
	Fap[nod] = p;
	
	for ( vector<int>::iterator itt = G[nod].begin() ; itt != G[nod].end() ; ++itt ){
		int nodvcn = (*itt);
		dfs(nodvcn,niv+1);
		
		Eul[++p] = nod; Niv[p] = niv;
	}
}

inline void Rmq () {
	int i,k;
	
	for ( i = 2 ; i <= p ; ++i ){
		E[i] = E[i>>1] + 1;
	}
	
	for ( i = 1 ; i <= p ; ++i ){
		rmq[0][i] = i;
	}
	
	for ( k = 1 ; k <= E[p] ; ++k ){
		for ( i = 1 ; i + (1<<k) - 1 <= p ; ++i ){
			rmq[k][i] = Niv[rmq[k-1][i]] <= Niv[rmq[k-1][i+(1<<(k-1))]] ? rmq[k-1][i] : rmq[k-1][i+(1<<(k-1))];
		}
	}
}

inline void swap ( int a , int b ){
	int aux = a ; a = b ; b = aux;
}

inline int lca ( int nod1 , int nod2 ){
	if ( Fap[nod1] > Fap[nod2] ){
		swap(nod1,nod2);
	}
	int x = Fap[nod1]; int y = Fap[nod2];
	int e = E[y-x+1];
	
	int poz_lca = Niv[rmq[e][x]] <= Niv[rmq[e][y-(1<<e)+1]] ? rmq[e][x] : rmq[e][y-(1<<e)+1];
	return Eul[poz_lca];
}

inline void solve () {
	
	for ( int i = 1 ; i <= q ; ++i ){
		int x,y;
		fscanf(f,"%d %d",&x,&y);
		fprintf(g,"%d\n",lca(x,y));
	}
}

int main () {
	
	citire();
	dfs(1,1);
	Rmq();
	solve();
	
	fclose(f);
	fclose(g);
	
	return 0;
}