Pagini recente » Cod sursa (job #1563153) | Cod sursa (job #691044) | Cod sursa (job #2808830) | Cod sursa (job #2436836) | Cod sursa (job #938628)
Cod sursa(job #938628)
#include <fstream>
#include <vector>
#include <algorithm>
#include <stdlib.h>
#include <math.h>
using namespace std;
ifstream fi ("lca.in");
ofstream fo ("lca.out");
const int dim = 100005;
int N, M, X, Y, index, T[dim], comp[dim], nrelem[dim], capat[dim], niv[dim];
vector <int> V[dim];
void cit ()
{
fi >> N >> M;
for (int i = 2; i <= N; i++)
{
fi >> T[i];
V[T[i]].push_back (i);
}
}
void dfs (int n, int t)
{
niv[n] = niv[t] + 1;
comp[n] = ++index;
nrelem[comp[n]] = 0;
for (int i = 0, f; i < V[n].size(); i++)
{
f = V[n][i];
dfs (f, n);
if (nrelem[comp[f]] > nrelem[comp[n]])
{
comp[n] = comp[f];
}
}
for (int i = 0, f; i < V[n].size(); i++)
{
f = V[n][i];
if (comp[f] != comp[n])
{
capat[comp[f]] = f;
}
}
nrelem[comp[n]] ++;
}
void urca (int &n)
{
n = T[ capat[ comp[n] ] ];
}
void rez ()
{
dfs (1, 0);
capat[comp[1]] = 1;
while (M --)
{
fi >> X >> Y;
while (comp[X] != comp[Y])
{
if (niv[capat[comp[X]]] > niv[capat[comp[Y]]])
urca (X);
else
urca (Y);
}
fo << (niv[X] < niv[Y] ? X : Y) << '\n';
}
}
void afi ()
{
}
int main ()
{
cit ();
rez ();
afi ();
return 0;
}