Cod sursa(job #528468)

Utilizator ooctavTuchila Octavian ooctav Data 2 februarie 2011 21:29:45
Problema Lowest Common Ancestor Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;

#define FOR(i, a, b)	for(int i = a ; i <= b ; i++)
#define FORV(V) for(vector<int> :: iterator it = V.begin() ; it != V.end() ; it++)

const int NMAX = 100005;
const int H = 618;//il fac 2 * 314

int N, M;
int T[NMAX], T2[NMAX];
int LV[NMAX];
vector<int> Graf[NMAX];

void citi()
{
	cin >> N >> M;
	FOR(i, 2, N)
	{
		cin >> T[i];
		Graf[T[i]].push_back(i);
	}
}

void dfs(int nod, int str, int lev)
{
	T2[nod] = str;
	LV[nod] = lev;
	if(lev % H == 0)	str = nod;
	
	FORV(Graf[nod])
		dfs(*it, str, lev + 1);
}

int lca(int x, int y)
{
	while(T2[x] != T2[y])
		if(LV[x] > LV[y])	x = T2[x];
		else				y = T2[y];
		
	while(x != y)
		if(LV[x] > LV[y])	x = T[x];
		else				y = T[y];
		
	return x;
}

int main()
{
	freopen("lca.in", "r", stdin);
	freopen("lca.out", "w", stdout);
	citi();
	dfs(1, 0, 0);
	FOR(i, 1, M)
	{
		int x, y;
		cin >> x >> y;
		printf("%d\n", lca(x, y));
	}
	return 0;
}