Cod sursa(job #412989)

Utilizator WildComunistChristian Ceausu WildComunist Data 7 martie 2010 12:29:44
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include<fstream.h>
#define endl '\n'

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

int n,vt[100001],p[100001],m,a[100001],b[100001];


int drum1(int x,int y){
	if(x==y) 
		return 1;
	if(vt[x]==0) return 0;
	a[0]++;
	a[a[0]]=vt[x];
	return drum1 (vt[x],y);
}

int drum2(int x,int y){
	if(x==y) 
		return 1;
	if(vt[x]==0) return 0;
	b[0]++;
	b[b[0]]=vt[x];
	return drum2 (vt[x],y);
}

int main(){
	int i,j,isp,s,d;
	fin>>n>>m;
	for(i=2;i<=n;i++){
		fin>>vt[i];
		p[vt[i]]=1;
	}
	while(m--){
		fin>>s>>d;
		a[0]=0;
		isp=drum1(s,d);
		if(isp) fout<<d<<endl;
		else {
			b[0]=0;
			isp=drum2(d,s);
			if(isp)
				fout<<s<<endl;
			else{
				i=a[0];
				j=b[0];
				while(a[i]==b[j]&&i&&j){
					i--;
					j--;
			    }
			    i++;
				fout<<a[i]<<endl;
			}
		}
	}		
    return 0;
}