Cod sursa(job #1796989)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 3 noiembrie 2016 22:10:38
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 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];
bool visited[MaxN];
vector <int> Graph[MaxN];
void DFS(int node)
{
	first[node]=size+1;
	v[0][++size]=node;
	visited[node]=true;
	for(int i=0;i<Graph[node].size();i++)
		if(!visited[Graph[node][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);
		Graph[i].push_back(val[i]);
	}
	DFS(1);
	for(int i=1;i<=2*N-1;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];
		Log=L[Y-X+1];
		fprintf(OUT,"%d\n",min(v[Log][Y],v[Log][X+(1<<Log)-1]));
	}
    return 0;
}