Cod sursa(job #2877832)

Utilizator QwertyDvorakQwerty Dvorak QwertyDvorak Data 25 martie 2022 13:53:19
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bits/stdc++.h>
using namespace std;

#define pb push_back

#define dbg(x) cout << #x <<": " << x << "\n";
using ll = long long;

const string fn = "lca";
ifstream fin(fn + ".in");
ofstream fout(fn + ".out");

const int mxn = 100000;

int n, q;
int ans[2000005];
int dad[mxn + 5];
vector<int> g[mxn + 5];
vector<pair<int, int> > qs[mxn + 5];
bitset < mxn + 5 > viz;

int find(int x) {
	return dad[x] != x ? dad[x] = find(dad[x]) : x;
}

void unionn(int x, int y) {
	dad[find(y)] = dad[find(x)];
}


void dfs(int nod) {

	viz[nod] = 1;
	dad[nod] = nod;
	for (auto i : g[nod]) {
		if (!viz[i]) {
			dfs(i);
			unionn(nod, i);
			dbg(nod)
			// dbg(find(nod));
			// dad[find(nod)] = nod;
		}
	}
	for (auto i : qs[nod])
		if (viz[i.first])
			ans[i.second] = dad[find(i.first)];
}


int main() {

	fin >> n >> q;
	for (int i = 2; i <= n ; ++i) {
		int x;
		fin >> x;
		g[x].pb(i);
	}

	for (int i = 1; i <= q; ++i) {
		int x, y;
		fin >> x >> y;
		qs[x].pb({y, i});
		qs[y].pb({x, i});
	}

	dfs(1);

	for (int i = 1; i <= q; ++i)
		fout << ans[i] << "\n";

	return 0;
}