Pagini recente » Cod sursa (job #3264556) | Cod sursa (job #1962419) | Cod sursa (job #2413445) | Cod sursa (job #1383329) | Cod sursa (job #3283977)
#include <iostream>
#include <algorithm>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
using VI = vector<int>;
using VVI = vector<VI>;
int n, q, timer;
VI tin, tout;
VVI G, anc;
int malog;
void DFS(int x)
{
tin[x] = ++timer;
for (auto y : G[x])
{
anc[0][y] = x;
DFS(y);
}
tout[x] = timer;
}
bool Contains(int x, int y)
{
return ((tin[x] <= tin[y]) && (tout[x] >= tout[y]));
}
int LCA(int x, int y)
{
if (Contains(x, y))
return x;
if (Contains(y, x))
return y;
for (int i = malog; i >= 0; --i)
{
if (!Contains(anc[i][x], y))
x = anc[i][x];
}
return anc[0][x];
}
int main()
{
fin >> n >> q;
int z;
malog = ceil(log2(n));
G = VVI(n + 1);
anc = VVI(malog + 1, VI(n + 1));
tin = tout = VI(n + 1);
for (int i = 2; i <= n; ++i)
{
fin >> z;
G[z].emplace_back(i);
}
anc[0][1] = 1;
DFS(1);
for (int i = 1; i <= malog; ++i)
for (int j = 1; j <= n; ++j)
anc[i][j] = anc[i - 1][anc[i - 1][j]];
int x, y;
for (int i = 1; i <= q; ++i)
{
fin >> x >> y;
fout << LCA(x, y) << '\n';
}
}