Cod sursa(job #1797021)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 3 noiembrie 2016 22:35:03
Problema Lowest Common Ancestor Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define INF 2140000000
#define MaxN 100005
#define MaxLog 17
using namespace std;
      
FILE *IN,*OUT;
int N,M,size=0,L[2*MaxN],v[MaxLog][2*MaxN],h[MaxN],val[MaxN],X,Y,Log,first[MaxN],Ans;
vector <int> Graph[MaxN];
void DFS(int node)
{
	first[node]=size+1;
	v[0][++size]=node;
	for(int i=0;i<Graph[node].size();i++)
		DFS(Graph[node][i]);
	v[0][++size]=val[node];
}

int main()
{
    IN=fopen("lca.in","r");
    OUT=fopen("lca.out","w");
	fscanf(IN,"%d%d",&N,&M);
	
	for(int i=2;i<=2*N;i++)
		L[i]=L[i/2]+1;

	for(int i=2;i<=N;i++)
	{
		fscanf(IN,"%d",&val[i]),h[i]=h[val[i]]+1;
		Graph[val[i]].push_back(i);
	}
	
	DFS(1);
	
	for(int i=1;i<=size;i++)
		for(int j=1;j<MaxLog;j++)
		{
			v[j][i]=v[j-1][i];
			if(i>1<<(j-1)&&h[v[j][i]]>h[v[j-1][i-(1<<(j-1))]])
				v[j][i]=v[j-1][i-(1<<(j-1))];
		}
	
	for(int i=1;i<=M;i++)
	{
		fscanf(IN,"%d%d",&X,&Y);
		X=first[X],Y=first[Y];
		if(X>Y)
		{
			int t=X;
			X=Y;
			Y=t;
		}
		Log=L[Y-X+1];
		Ans=v[Log][Y];
		if(h[Ans]>h[v[Log][X+(1<<Log)-1]])
			Ans=v[Log][X+(1<<Log)-1];
		fprintf(OUT,"%d\n",Ans);
	}
    
	return 0;
}