Cod sursa(job #1453239)

Utilizator theprdvtheprdv theprdv Data 23 iunie 2015 07:16:37
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#define _CRT_SECURE_NO_DEPRECATE
#include <vector>
#define MAXN 100005

using namespace std;

const int h = 200;

int N, M, T[MAXN], T2[MAXN], Lev[MAXN];
vector <int> G[MAXN];

void DFS(int n, int n1, int lv){
	Lev[n] = lv, T2[n] = n1;

	if (!lv % h) n1 = n;

	for (int i = 0; i < (int)G[n].size(); ++i)
		DFS(G[n][i], n1, lv + 1);
}

int LCA(int x, int y){
	while (T2[x] != T2[y])
		if (Lev[x] > Lev[y]) x = T2[x];
		else y = T2[y];

	while (x != y)
		if (Lev[x] > Lev[y]) x = T[x];
		else y = T[y];
	return x;
}

int main(){
	FILE *fin = fopen("lca.in", "r"),
		 *fout = fopen("lca.out", "w");
	
	fscanf(fin, "%d %d", &N, &M);
	for (int i = 2; i <= N; ++i)
		fscanf(fin, "%d", &T[i]),
		G[T[i]].push_back(i);
	DFS(1, 0, 0);

	while (M--){
		int x, y;
		fscanf(fin, "%d %d", &x, &y);
		fprintf(fout, "%d\n", LCA(x, y));
	}
	return 0;
}