Cod sursa(job #1786263)

Utilizator RobertSSamoilescu Robert RobertS Data 22 octombrie 2016 17:34:19
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
#include <vector>


using namespace std;


int const MAX_N = 100001;
int const MAX_M = 2000001;

int const ROOT = 1; //radacina


int N, M; //numarul de noduri, numarul de queries
vector<int> graph[MAX_N]; //reprezentarea grafului prin liste

vector<int> euler_rep; //reprezentarea euler cu noduri
vector<int> depth_rep; //reprezentare euler cu adancimi

void DFS(int node, int depth) {
		
	euler_rep.push_back(node);
	depth_rep.push_back(depth);
	
	for (size_t i = 0; i < graph[node].size(); i++) {
		DFS(graph[node][i], depth + 1);
		euler_rep.push_back(node);
		depth_rep.push_back(depth);
	}

}

int query(int x, int y) {
	int index = 0, lca = N + 1;
	bool left = false; //variabila care imi semnaleaza inceputul secventei

	for (size_t i = 0; i < euler_rep.size(); i++) {
		if (euler_rep[i] == x || euler_rep[i] == y) {
			if (!left) left = true;
			else {
				lca = min(lca, euler_rep[i]);
				break;
			}
		}

		if (left)
			lca = min(lca, euler_rep[i]);	
			
	}

	return lca;
}

int main() {

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



	fin >> N >> M;
	for (int i = 2; i <= N; i++) {
		int father;
		fin >> father;
		graph[father].push_back(i);		
	}
	
	


	DFS(ROOT, 0);
	

	for (int i = 0; i < M; i++) {
		int x, y;
		fin >> x >> y;
		cout << query(x, y) << '\n';
	}

	fin.close();
	fout.close();


	return 0;
}