Cod sursa(job #3288119)

Utilizator AndreiMLCChesauan Andrei AndreiMLC Data 20 martie 2025 16:42:03
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#include <map>

using namespace std;

ifstream f("lca.in");
ofstream g("lca.out");

const int NMAX = 100005;

map<pair<int, int>, int> queries;
int n, m;
vector<int> graph[NMAX];
int parent[NMAX];
int adj[NMAX];
int viz[NMAX];
int stram[NMAX];

int find(int x) {
	if (parent[x] != x) {
		parent[x] = find(parent[x]);
	}
	return parent[x];
}

void unionSet(int x, int y) {
	int rootX = find(x);
	int rootY = find(y);
	if (rootX != rootY) {
		parent[rootY] = rootX;
	}
}

void tarjan(int nod)
{
	viz[nod] = 1;
	stram[nod] = nod;

	for (int v : graph[nod])
	{
		if (!viz[v])
		{
			tarjan(v);
			unionSet(nod, v);
			stram[find(nod)] = nod;
		}
	}

	for (auto it : queries)
	{
		if (it.first.first == nod && viz[it.first.second])
		{
			queries[it.first] = stram[find(it.first.second)];
		}
		else if (it.first.second == nod && viz[it.first.first])
		{
			queries[it.first] = stram[find(it.first.first)];
		}
	}
}

int main()
{
	f >> n >> m;
	parent[1] = 1;
	for (int i = 2; i <= n; i++)
	{
		f >> adj[i];
		graph[adj[i]].push_back(i);
		graph[i].push_back(adj[i]);

		parent[i] = i;
	}
	for (int i = 1; i <= m; i++)
	{
		int x, y;
		f >> x >> y;
		queries[{x, y}] = 0;
	}
	tarjan(1);
	for(auto it = queries.crbegin(); it != queries.crend() ;it++)
	{
		g << it -> second << '\n';
	}
	return 0;
}