Pagini recente » Cod sursa (job #1362172) | Cod sursa (job #1668008) | Cod sursa (job #2682363) | Cod sursa (job #2724725) | Cod sursa (job #3136959)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, q, stramosi[19][100005], adancimi[100005];
vector<int> G[100005];
void precalc()
{
int log = log2(n);
for (int i = 1; i <= log; i++)
{
for (int j = 1; j <= n; j++)
{
stramosi[i][j] = stramosi[i - 1][stramosi[i - 1][j]];
if (stramosi[i-1][j] == 0)
continue;
}
}
}
void DFS(int nod, int adancime)
{
adancimi[nod] = adancime;
for (int i = 0; i < G[nod].size(); i++)
{
int vecin = G[nod][i];
if (adancimi[vecin] == 0)
{
DFS(vecin, adancime + 1);
stramosi[0][vecin] = nod;
}
}
}
void lca(int x, int y)
{
if (adancimi[x] > adancimi[y])
swap(x, y);
int d = adancimi[y] - adancimi[x];
for (int i = log2(n); i >= 0; i--)
{
if (d & (1 << i))
{
d -= i;
y = stramosi[i][y];
}
}
if (x != y)
{
for (int i = log2(n); i >= 0; i--)
{
if (stramosi[i][x] != stramosi[i][y])
{
x = stramosi[i][x];
y = stramosi[i][y];
}
}
}
fout << x << '\n';
}
int main()
{
fin >> n >> q;
for (int i = 2; i <= n; i++)
{
int x;
fin >> x;
G[x].push_back(i);
G[i].push_back(x);
}
DFS(1, 1);
precalc();
for (int i = 1; i <= q; i++)
{
int x, y;
fin >> x >> y;
lca(x, y);
}
return 0;
}