Cod sursa(job #964918)

Utilizator miu_mik93FMI - Paduraru Miruna miu_mik93 Data 22 iunie 2013 18:55:36
Problema Lowest Common Ancestor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <string>
using namespace std;
int p, n, st[100];
FILE *f;
FILE *g;
int m, T[100000];
struct nodu
{
	int m1, m2;
}pai[2000000];
int k = 1;
void citire()
{
	f = fopen("lca.in", "r");
	fscanf (f, "%d %d", &n, &m);
	for (int i=2; i<=n; i++)
		fscanf(f, "%d", &T[i]);
	while (!feof(f))
	{
		fscanf(f, "%d %d", &pai[k].m1, &pai[k].m2);
		k++;
	}
	fclose(f);
}
int Lev[100];
void dfs(int nod, int lev)
{
    Lev[nod] = lev;
    for(int i = 1; i <= n; ++i)
        if(T[i] == nod)
            dfs(i, lev+1);
}

int main()
{
	citire();
	dfs(1, 0);
	g = fopen("lca.out", "w");
	for (int i=1; i<=m; i++)
	{
		while (pai[i].m1 != pai[i].m2)
			if (Lev[pai[i].m1] > Lev[pai[i].m2])
			{
				pai[i].m1 = T[pai[i].m1];
			}
			else if (Lev[pai[i].m1] < Lev[pai[i].m2])
					pai[i].m2 = T[pai[i].m2-1];
				else if (Lev[pai[i].m1] == Lev[pai[i].m2])
				{
					pai[i].m1 = T[pai[i].m1];
					pai[i].m2 = T[pai[i].m2];
				}


		fprintf(g, "%d\n", pai[i].m1);
	}
	fclose(g);
	return 0;
}