Cod sursa(job #1452944)

Utilizator theprdvtheprdv theprdv Data 22 iunie 2015 13:38:12
Problema Lowest Common Ancestor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#define MAXN 100000
#define left (n << 1)
#define right (left + 1)
#define mid ((l + r) >> 1)

using namespace std;

int N, M, no, val, pos, a, b, ans = (1 << 30), Beg[2 * MAXN], End[2 * MAXN], T[4 * MAXN];
vector <int> list[MAXN];

inline int min(int a, int b) { return a < b ? a : b; }

void update(int n = 1, int l = 1, int r = 2 * N - 1){
	if (l == r){
		T[n] = val;
		return;
	}
	if (pos <= mid) update(left, l, mid);
	else update(right, mid + 1, r);

	T[n] = min(T[left], T[right]);
}

void query(int n = 1, int l = 1, int r = 2 * N - 1){
	if (a <= l && r <= b){
		ans = min(ans, T[n]);
		return;
	}
	if (a <= mid) query(left, l, mid);
	if (b > mid) query(right, mid + 1, r);
}

void DFS(int n = 1){
	Beg[n] = ++no;
	pos = no, val = n;
	update();
	for (int i = 0; i < (int)list[n].size(); ++i)
		DFS(list[n][i]),
		pos = ++no, val = n, update();

	End[n] = no;
}

int main(){
	freopen("lca.in", "r", stdin);
	freopen("lca.out", "w", stdout);

	scanf("%d %d", &N, &M);
	for (int i = 2, x; i <= N; ++i)
		scanf("%d", &x),
		list[x].push_back(i);
	DFS();

	for (int x, y; M; --M, ans = (1 << 30)){
		scanf("%d %d", &x, &y);
		a = Beg[x], b = Beg[y];
		if (a > b) a ^= b ^= a ^= b;
		query();
		printf("%d\n", ans);
	}

	return 0;
}