Cod sursa(job #2857003)

Utilizator DooMeDCristian Alexutan DooMeD Data 24 februarie 2022 19:11:29
Problema Lowest Common Ancestor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 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 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;
}