Cod sursa(job #3265469)

Utilizator CosminaneBoac Mihai Cosmin Cosminane Data 30 decembrie 2024 13:46:35
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
int dp[100005][20], dad[100005], depth[100005];
vector <int> son[100005];
void dfs(int x){
	int i;
	for( i = 0; i < son[x].size(); i++ ){
		depth[son[x][i]] = depth[x] + 1;
		dfs( son[x][i] );
	}
}
int lca(int x, int y){
	int i;
	if( depth[x] < depth[y] ){
		swap( x, y );
	}
	for( i = 19; i >= 0; i-- ){
		if( depth[x] - ( 1 << i ) >= depth[y] ){
			x = dp[x][i];
		}
	}
	//cout << x << ' ' << y << ' ' << depth[x] << ' ' << depth[y] << '\n';
	if( x == y ){
		return x;
	}
	for( i = 19; i >= 0; i-- ){
		if( dp[x][i] != dp[y][i] ){
			x = dp[x][i];
			y = dp[y][i];
		}
	}
	return dp[x][0];
}
int main(){
	int n, q, i, j, x, y;
	ifstream fin( "lca.in" );
	ofstream fout( "lca.out" );
	fin >> n >> q;
	for( i = 2; i <= n; i++ ){
		fin >> dad[i];
		dp[i][0] = dad[i];
		son[dad[i]].push_back( i );
	}
	for( i = 1; i <= n; i++ ){
		for( j = 1; j < 20; j++ ){
			dp[i][j] = dp[dp[i][j - 1]][j - 1];
		}
	}
	dfs( 1 );
	for( i = 0; i < q; i++ ){
		fin >> x >> y;
		fout << lca( x, y ) << '\n';
	}
	return 0;
}