Cod sursa(job #967985)

Utilizator dropsdrop source drops Data 28 iunie 2013 22:55:03
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include <bitset>
#include <queue>
#include <deque>
#include <list>
#include <set>
#include <ctime>
#include <string>
#include <cstring>
#include <iomanip>
#include <algorithm>
using namespace std;
ifstream ff("test.in");
#define nl cout<<"\n";
#define max 100001
vector<int> vv[max];
int n, m, cc[2*max], nv[2*max], pp[max], rr[max][18], k;
bool ww[max];

void dfs(int a,int j){
	int l=vv[a].size(), b;
	ww[a]=1;
	cc[++k]=a;
	nv[k]=j;
	for(int i=0;i<l;i++){
		b=vv[a][i];
		if(!ww[b])dfs(b,j+1);
		cc[++k]=a;
		nv[k]=j;
	}
}

void rmq(){
	for(int i=1;i<=k;i++) rr[i][0]=i;
	for(int j=1;(1<<j)<=k;j++)
	for(int i=1;i+(1<<j)-1<=k;i++)
		if(nv[rr[i][j-1]]<nv[rr[i+(1<<(j-1))][j-1]]) 
			rr[i][j]=rr[i][j-1]; else
			rr[i][j]=rr[i+(1<<(j-1))][j-1];

}

int main(){
	int a, b, c;
	ff >> n >> m;
	for(int i=2;i<=n;i++){
		ff >> a;
		vv[a].push_back(i);
	}
	dfs(1,0);
	for(int i=1;i<=k;i++)
	if(!pp[cc[i]])pp[cc[i]]=i;
	rmq();
	// for(int i=1;i<=k;i++) {
	// for(int j=0;j<10;j++) cout << rr[i][j] << " "; nl; }
//	for(int i=1;i<=k;i++) cout << i << " "; nl;
//	for(int i=1;i<=k;i++) cout << nv[i] << " "; nl;
	for(int i=1;i<=m;i++){
		ff >> a >> b;
		a=pp[a]; b=pp[b]; if(a>b)swap(a,b);
		c=log(b-a+1)/log(2);
	//	cout << a << " " << b << " " << c << endl;
		if(nv[rr[a][c]]<nv[rr[b-(1<<c)+1][c]])cout << cc[rr[a][c]] << "\n"; else
			cout << cc[rr[b-(1<<c)+1][c]] << "\n";
	}
}