Cod sursa(job #915725)

Utilizator b_ady20Branescu Adrian b_ady20 Data 15 martie 2013 11:37:41
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<cstdio>
#include<vector>
#define nmax 100001
using namespace std;

struct etc{
	int node,level;
}eulerv[nmax*100];

vector<int> list[nmax];

int father[nmax],k,n,dist[nmax],poz[nmax];

void euler(int nod){
	int i;
	if(!list[nod].size()){
		eulerv[++k].node=nod;
		if(!poz[nod])
			poz[nod]=k;
	}
	else{
		eulerv[++k].node=nod;
		if(!poz[nod]) poz[nod]=k;
		for(i=0;i<list[nod].size();++i){
			euler(list[nod][i]);
			eulerv[++k].node=nod;
		}
	}
}
int search(int x,int y){
	int i,min=nmax,minpos=0;
	if(poz[x]<=poz[y]){
		for(i=poz[x];i<=poz[y];++i)
			if(min>eulerv[i].level){
				min=eulerv[i].level;
				minpos=i;
			}
	}
	else
		for(i=poz[y];i<=poz[x];++i)
			if(min>eulerv[i].level){
				min=eulerv[i].level;
				minpos=i;
			}
	return eulerv[minpos].node;
};
int main(){
	int i,no_qr,x,y;
	freopen("lca.in","r",stdin);
	freopen("lca.out","w",stdout);
	scanf("%d%d",&n,&no_qr);
	for(i=2;i<=n;++i){
		scanf("%d",father+i);
		list[father[i]].push_back(i);
	}
	for(i=2;i<=n;++i)
		dist[i]=dist[father[i]]+1;
	euler(1);
	for(i=1;i<=k;++i)
		eulerv[i].level=dist[eulerv[i].node];
	/*for(i=1;i<=k;++i)
		printf("%d ",eulerv[i].level);
	printf("\n");
	for(i=1;i<=k;++i)
		printf("%d ",eulerv[i].node);*/
	for(i=1;i<=no_qr;++i){
		scanf("%d%d",&x,&y);
		printf("%d\n",search(x,y));
	}
	return 0;
}