Pagini recente » Cod sursa (job #1800350) | Cod sursa (job #2084648)
#define DM 100001
#include <cmath>
#include <fstream>
#include <vector>
using namespace std;
ifstream fi ("lca.in");
ofstream fo ("lca.out");
int n, m, a, b, prnt[DM], prt[DM], nvl[DM], md;//prt - parintii gruparii; nvl - nivelul nodului; md - sqrt de n(ce folosesc ca modulo); prnt - parintele propriu-zis
vector <int> v[DM];
void test2(int nod, int p, int n)//nod, parinte, nivel
{
nvl[nod] = n;
for (auto i:v[nod])
if (i != p)
test2(i, nod, n + 1);
}
void test(int nod, int p, int g)//nod, parinte, nodul gruparii
{
prt[nod] = g;
if (nvl[nod]/md != nvl[p]/md)
g = nod;
for (auto i:v[nod])
if (i != p)
test(i, nod, g);
}
int main()
{
fi >> n >> m;
for (int i = 2; i <= n; ++i)
{
fi >> prnt[i];
v[prnt[i]].push_back(i);
v[i].push_back(prnt[i]);
}
md = (int)(sqrt(n));
test2(1, 0, 1);
test(1, 0, 1);
for (int i = 1; i <= m; ++i)
{
fi >> a >> b;
if (prt[a] != prt[b])
{
while (nvl[prt[a]] < nvl[prt[b]])
b = prnt[prt[b]];
while (nvl[prt[a]] > nvl[prt[b]])
a = prnt[prt[a]];
while (a != b)
a = prnt[a], b = prnt[b];
}
if (prt[a] == prt[b])
{
while (nvl[b] > nvl[a])
b = prnt[b];
while (nvl[b] < nvl[a])
a = prnt[a];
while (a != b)
b = prnt[b], a = prnt[a];
}
fo << a << '\n';
}
return 0;
}