Pagini recente » Cod sursa (job #56920) | Cod sursa (job #351888) | Cod sursa (job #955798) | Cod sursa (job #1323906) | Cod sursa (job #964918)
Cod sursa(job #964918)
#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;
}