Cod sursa(job #2760103)

Utilizator MateGMGozner Mate MateGM Data 22 iunie 2021 22:31:23
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <iostream>
#include <vector>
#include <list>
#include <fstream>
#include <cmath>

using namespace std;

ifstream be("lca.in");
ofstream ki("lca.out");

void beolvas(vector<list<int>>& sz_lista, vector<int>& szulo, int n);
void bejar(const vector<list<int>>& sz_lista, int u, vector<int>& szint, int& h, vector<bool>& jart);
int LCA_sqrt(int x, int y, vector<int>& szulo, vector<int>& p, vector<int>& szint);
void LCA(const vector<list<int>>& sz_lista, vector<int>& szulo, int n, int m);

int main() {
	int n, m;
	be >> n >> m;
	vector<int> szulo(n);
	vector<list<int>> sz_lista(n+1);
	beolvas(sz_lista, szulo, n);
	LCA(sz_lista, szulo, n, m);
}

void beolvas(vector<list<int>>& sz_lista, vector<int>& szulo, int n) {
	for (int i = 1; i < n; i++) {
		int x;
		be >> x;
		x--;
		szulo[i] = x;
		sz_lista[x].push_back(i);
		sz_lista[i].push_back(x);
	}
}

void bejar(const vector<list<int>>& sz_lista, int u, vector<int>& szint, int& h, vector<bool>& jart){
	jart[u] = true;
	for (int i : sz_lista[u]) {
		if (!jart[i]) {
			szint[i] = szint[u] + 1;
			if (szint[i] > h)h = szint[i];
			bejar(sz_lista, i, szint, h, jart);
		}
	}
}

int LCA_sqrt(int x, int y, vector<int>& szulo, vector<int>& p, vector<int>& szint){
	while (p[x] != p[y]){
		if (szint[x] > szint[y])
			x = p[x];
		else
			y = p[y];
	}

	while (x != y){
		if (szint[x] > szint[y])
			x = szulo[x];
		else
			y = szulo[y];
	}

	return x;
}

void LCA(const vector<list<int>>& sz_lista, vector<int>& szulo, int n, int m) {
	vector<int> szint(n, 0);
	vector<bool> jart(n, false);

	int h = 0;
	bejar(sz_lista, 0, szint, h, jart);

	vector<int> p(n);
	int k = sqrt(h);
	for (int i = 0; i < n; i++){
		if (szint[i] <= k) p[i] = 0;
		else if (szint[i] % k == 1) p[i] = szulo[i];
		else p[i] = p[szulo[i]];
	}

	for (int i = 0; i < m; i++){
		int x, y;
		be >> x >> y;
		x--, y--;
		ki << LCA_sqrt(x, y, szulo, p, szint) + 1 << "\n";
	}
}