Cod sursa(job #2857015)

Utilizator DooMeDCristian Alexutan DooMeD Data 24 februarie 2022 19:26:08
Problema Lowest Common Ancestor Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <bits/stdc++.h>
using namespace std;
const int nmax = 1e5;
const int lg = 17; 

vector<vector<int>> dx(nmax+5);
int lift[nmax+5][lg+5];
int enter[nmax+5], ies[nmax+5];
bool viz[nmax+5];
int t;

void dfs(int node) {
	enter[node] = ++t;
	viz[node] = true;
	for(int i=1; i<=lg; i++)
		lift[node][i] = lift[lift[node][i-1]][i-1];
	for(auto i : dx[node]) 
		if(!viz[i]) 
			dfs(i);
	ies[node] = ++t;
}

bool stramos(int a, int b) {
	if(enter[a]<enter[b] and ies[a]>ies[b]) return true;
	return false;
}

int lca(int a, int b) {
	if(stramos(a,b))
		return a;
	if(stramos(b,a))
		return b;
	for(int i=lg; i>=0; i--) 
		if(!stramos(lift[a][i],b))
			a = lift[a][i];
	return lift[a][0];
}

int main () {
	ifstream f("lca.in");
	ofstream g("lca.out");
	
	int n,m; f >> n >> m;
	for(int y=2; y<=n; y++) {
		int x; f >> x;
		dx[x].emplace_back(y);
		dx[y].emplace_back(x);
		lift[y][0] = x;
	}
	dfs(1);
	enter[0] = 0;
	ies[0] = 1e9;
	for(int i=1; i<=m; i++) {
		int a,b; f >> a >> b;
		g << lca(a,b) << "\n";
	}
	return 0;
}