Cod sursa(job #3228202)

Utilizator AndreasBossGamerBaragau Andreas AndreasBossGamer Data 6 mai 2024 18:04:54
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <queue>
#include <vector>

using namespace std;

ifstream cin("lca.in");
ofstream cout("lca.out");

vector<vector<int>> adj;
vector<int> in, out;
int rmq[19][100001];
int timer = 0;

void dfs(int node, int parent)
{
	in[node] = ++timer;
	rmq[0][node] = parent;
	for (int e = 1; e <= 18; e++)
	{
		if (rmq[e - 1][node] == 0)
			break;
		rmq[e][node] = rmq[e - 1][rmq[e - 1][node]];
	}

	for (auto vecin : adj[node])
		if (vecin != parent)
			dfs(vecin, node);

	out[node] = ++timer;
}

bool isAnc(int x, int y)
{
	return (in[x] <= in[y]) && (out[x] >= out[y]);
}

int lca(int x, int y)
{
	if (isAnc(x, y))
		return x;
	if (isAnc(y, x))
		return y;
	for (int e = 18; e >= 0; e--)
	{
		if (!isAnc(rmq[e][x], y) && rmq[e][x] != 0)
			x = rmq[e][x];
	}
	return rmq[0][x];
}

int main()
{
	int n, q;
	cin >> n >> q;
	adj.resize(n + 1);
	in.resize(n + 1);
	out.resize(n + 1);
	for (int i = 2; i <= n; i++) 
	{
		int aux;
		cin >> aux;
		adj[aux].push_back(i);
	}

	dfs(1, 0);

	while (q--)
	{
		int x, y;
		cin >> x >> y;
		cout << lca(x, y) << "\n";
	}
}