Cod sursa(job #1226439)

Utilizator andreas.chelsauAndreas Chelsau andreas.chelsau Data 5 septembrie 2014 14:07:50
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <vector>
#include <math.h>
#include <algorithm>
using namespace std;

vector<int> M[2],adj[100010];
int k,first[100010],t[1800010][20];

void dfs(int n){
//	cout<<n<<" "<< M[0].size()<<'\n';
	first[n] = M[0].size();
	for(unsigned int i = 0; i < adj[n].size(); i++){
			M[0].push_back(n); 
			M[1].push_back(k++);
			dfs(adj[n][i]);
	}
	M[0].push_back(n);
	M[1].push_back(k--);
	

}
void insert(int j, int i){
	adj[j].push_back(i);
}
void process_rmq(){
	for(int i = 0; i < (int)M[0].size(); i++)
		t[i][0] = i;
	for(int j = 1; (1 << j) <= (int)M[0].size(); j++){
		for(int i = 0; i + (1 << j) - 1 < (int)M[0].size(); i++)
			t[i][j] = M[1][t[i][j - 1]] < M[1][t[i + (1 << (j - 1))][j - 1]] ? t[i][j - 1] : t[i + (1 << (j - 1))][j - 1];

	}
}
void lca(int i, int j){
	int ci = min(first[i],first[j]),cj = max(first[i],first[j]);
	i = ci,j = cj;
	int k = (int)(log10((double)(j - i + 1)) / log10(2.0));
	int rez = M[1][t[i][k]] < M[1][t[j - (1 << k) + 1][k]] ? M[0][t[i][k]] : M[0][t[j - (1 << k) + 1][k]];
	printf("%d\n", rez );
}

int main(){
	freopen("lca.in","r",stdin);
	freopen("lca.out","w",stdout);
	int n,q;
	scanf("%d%d",&n,&q);
	for(int i = 2; i <= n; i++){
		int a;
		scanf("%d",&a);
		insert(a,i);
	}
	dfs(1);
	process_rmq();
	for(int i = 0; i < q; i++){
		int a,b;
		scanf("%d%d",&a,&b);
		lca(a, b);
	}
	return 0;
}