Cod sursa(job #1917681)

Utilizator tonisnakesBoar Antonio tonisnakes Data 9 martie 2017 12:46:29
Problema Lowest Common Ancestor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 100005
#define KMAX 18
using namespace std;

ifstream fin ("lca.in");
ofstream fout ("lca.out");

int n, m, stramosi[KMAX][NMAX], level[NMAX];
vector <int> g[NMAX];

void dfs (int node, int l) {
	level[node] = l;
	for (int i = 0; i < g[node].size(); ++i) {
		dfs(g[node][i], l+1);
	}
}

int main ()
{
	fin >> n >> m;
	for (int i = 2; i <= n; ++i) {
		fin >> stramosi[0][i];
		g[stramosi[0][i]].push_back(i);
	}
	int mpow;
	for (int k = 1; (1 << k) <= n; ++k) {
		for (int i = 2; i <= n; ++i) {
			stramosi[k][i] = stramosi[k-1][stramosi[k-1][i]];
		}
		mpow = k;
	}
	dfs(1,0);
	/*for (int i = 1; i <= n; ++i) {
		cout << level[i] << " ";
	}*/
	int x, y;
	for (int i = 1; i <= m; ++i) {
		fin >> x >> y;
		if (level[x] >= level[y]) {
			int diff = level[x] - level[y];
			for (int k = 0; (1 << k) <= diff; ++k) {
				if ((1 << k) & diff) {
					x = stramosi[k][x];
				}
			}
		}
		else {
			int diff = level[y] - level[x];
			for (int k = 0; (1 << k) <= diff; ++k) {
				if ((1 << k) & diff) {
					y = stramosi[k][y];
				}
			}
		}
		int k = 0;
		if (x == y) {
			fout << x << '\n';
		}
		else {
			while ((stramosi[k][x] != stramosi[k][y] || stramosi[k][x] == 0) && k <= mpow) {
				++k;
			}
			fout << stramosi[k][x] << '\n';
		}
	}
	
	fin.close();
	fout.close();
	return 0;
}