Cod sursa(job #2570630)

Utilizator michael_blazemihai mihai michael_blaze Data 4 martie 2020 18:10:29
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>
#define MAX 100005

std :: ifstream fin ("lca.in");
std :: ofstream fout("lca.out");

int n, m;

int parentArray[MAX];
int levels[MAX];

// int LCA(int node, int node1, int node2) {
// 	int commonAncestor = 0;
// 	if (node == node1)
// 		return node1;
// 	if (node == node2)
// 		return node2;

// 	for (int i = 1;i <= n;i ++) {
// 		if (parentArray[i] == node) {	
// 			commonAncestor += LCA(i, node1, node2);

// 			if (commonAncestor == node1 + node2) {
// 				commonAncestor = node;
// 				break;
// 			}
// 		}
// 	}

// 	return commonAncestor;
// }

void DFS(int node, int level) {
	levels[node] = level;

	for (int i = 1;i <= n;i ++) {
		if (parentArray[i] == node) {
			DFS(i, level + 1);
		}
	}
}

int main() {
	
	fin >> n >> m;

	parentArray[1] = -1;

	for (int i = 2;i <= n;i ++) {
		fin >> parentArray[i];
	}

	DFS(1, 0);

	int x, y;

	for (int i = 1;i <= m;i ++) {
		fin >> x >> y;

		while (x != y) {
			if (levels[x] > levels[y])
				x = parentArray[x];
			else
				y = parentArray[y];
		}

		fout << x << std :: endl;
	}

	fin.close();
	fout.close();
	return 0;
}