Cod sursa(job #1110790)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 18 februarie 2014 13:21:11
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define nmax 100005
using namespace std;

vector <int> v[nmax];
int euler[2*nmax+5],ep;
int lev[2*nmax+5];
int pos[nmax];
int index[20][2*nmax+5];
int n,m;

void dfs(int n,int k) {
	euler[++ep] = n;
	lev[ep] = k;
	pos[n] = ep;
	while (!v[n].empty()) {
		dfs(v[n].back(),k+1);
		v[n].pop_back();
		euler[++ep] = n;
		lev[0][ep] = k;
	}
}

int log(int a) {
	int x=0;
	while ((1<<(x-1)) < a) x++;
	return x;
}

int main() {
	freopen("lca.in","r",stdin);
	freopen("lca.out","w",stdout);
	scanf("%d %d",&n,&m);
	for (int i=1;i<n;i++) {
		int t;
		scanf("%d",&t);
		v[t].push_back(i+1);
	}
	for (int i=1;i<=2*n+1;i++) index[0][i] = i;
	dfs(1,1);
	for (int i=1;i<=19;i++) {
		for (int j=1;j<n-(1<<i)+1;j++) {
			index[i][j] = (lev[index[i-1][j]]<lev[index[i-1][j+(1<<(i-1))]])?(index[i-1][j]):(index[i-1][j+(1<<(i-1))]);
		}
	}
	for (int i=1;i<=m;i++) {
		int a,b;
		scanf("%d %d",&a,&b);
		if (pos[a] > pos[b]) swap(a,b);
		int k = log(pos[b]-pos[a]+1);
		int r = ()?():();
		printf("%d\n",);
	}
}