Cod sursa(job #1050175)

Utilizator miu_mik93FMI - Paduraru Miruna miu_mik93 Data 8 decembrie 2013 12:24:48
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <stdio.h>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <queue>
#include <cstdlib>
#include <iomanip>
#include <cmath>
//#include <unordered_map>

using namespace std;

#define NMAX 100001
#define ERROR 0.0001

vector <int> tata[NMAX];
int n, m, euler[NMAX], firstAp[NMAX], nivel[NMAX], k;
int i;

void DFS (int nod, int lev)
{
	euler[++k] = nod;
	nivel[k] = lev;
	firstAp[nod] = k;

	for (vector<int>::iterator it = tata[nod].begin(); it != tata[nod].end(); it++)
	{
		DFS (*it, lev + 1);
		
		euler[++k] = nod;
		nivel[k] = lev;
	}

}

inline int max(int a, int b)
{
	if ( a > b )
		return a;
	return b;
}

inline int min(int a, int b)
{
	if ( a < b )
		return a;
	else
		return b;
}

int minim (int x, int y)
{
	int mini = euler[x];
	int lim = min (x, y);
	int lims = max (x, y);
	for (int i = lim; i <= lims; i++)
	{
		if ( mini > euler[i] )
			mini = euler[i];
	}
	return mini;
}

int main ()
{
	FILE *f = fopen ("lca.in", "r");
	FILE *g = fopen ("lca.out", "w");

	int t;
	//tata[1].push_back (0);
	fscanf (f, "%d %d", &n, &m);
	for (int i = 2; i <= n; i++)
	{
		fscanf (f, "%d", &t);
		tata[t].push_back (i);
	}

	DFS (1, 0);

	int x, y;
	for (int i = 0; i < m; i++)
	{
		fscanf (f, "%d %d", &x, &y);
		fprintf(g, "%d\n", minim (firstAp[x], firstAp[y]));
	}


	fclose(f);
	fclose(g);
	return 0;
}