Cod sursa(job #2857022)

Utilizator DooMeDCristian Alexutan DooMeD Data 24 februarie 2022 19:32:20
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <bits/stdc++.h>
using namespace std;
const int nmax = 1e5;
const int lg = 16; 	
 
vector<vector<int>> dx(nmax+5);
int lift[nmax+5][lg+5];
int niv[nmax+5];
bool viz[nmax+5];	
 
void dfs(int node) {
	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]) {
			niv[i] = niv[node] + 1;
			dfs(i);
		}	
}	
 
int lca(int a, int b) {
	// a <
	if(niv[a] < niv[b]) swap(a,b);
	for(int i=lg; i>=0; i--)
		if(niv[lift[a][i]]>=niv[b])
			a = lift[a][i];
	
	if(a==b) return a;
	
	for(int i=lg; i>=0; i--)
		if(lift[a][i]!=lift[b][i]) {
			a = lift[a][i];
			b = lift[b][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;
	}
	niv[1] = 1;
	dfs(1);
	for(int i=1; i<=m; i++) {
		int a,b; f >> a >> b;
		g << lca(a,b) << "\n";
	}
	return 0;
}