Pagini recente » Cod sursa (job #1048250) | Cod sursa (job #814584) | Cod sursa (job #1274282) | Cod sursa (job #2773011) | Cod sursa (job #3325706)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
const int DIM = 100000, DIMP = 16;
int n, q;
int t[DIMP + 1][DIM + 1], niv[DIM + 1];
vector <int> v[DIM + 1];
void init ()
{
fin >> n >> q;
for (int i = 2; i <= n; i++)
{
fin >> t[0][i];
v[t[0][i]].push_back (i);
}
for (int p = 1; (1 << p) <= n; p++)
{
for (int i = 1; i <= n; i++)
t[p][i] = t[p - 1][t[p - 1][i]];
}
}
void dfs (int nod, int p)
{
niv[nod] = p;
for (int i = 0; i < (int) v[nod].size (); i++)
{
int vecin = v[nod][i];
dfs (vecin, p + 1);
}
}
void solve ()
{
int x, y;
while (q--)
{
fin >> x >> y;
if (niv[y] > niv[x])
swap (x, y);
int dif = niv[x] - niv[y];
for (int p = 0; (1 << p) <= dif; p++)
{
if ((dif >> p) & 1)
x = t[p][x];
}
for (int p = 0; (1 << p) <= n; p++)
{
if (t[p][x] != t[p][y])
x = t[p][x], y = t[p][y];
}
if (x != y)
x = t[0][x];
fout << x << "\n";
}
}
int main ()
{
init ();
dfs (1, 1);
solve ();
return 0;
}