Pagini recente » Cod sursa (job #1795501) | Cod sursa (job #808847) | Cod sursa (job #2190371) | Cod sursa (job #2414305) | Cod sursa (job #2205622)
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
using namespace std;
ifstream f ("lca.in");
ofstream g ("lca.out");
const int NMAX = 100001;
int N, M;
int T[18][NMAX], niv[NMAX];
vector<int> G[NMAX];
void precalcul()
{
for (int k = 1; (1 << k) <= N; k++)
for (int i = 1; i <= N; i++)
T[k][i] = T[k - 1][T[k - 1][i]];
}
void DFS (int x, int lev)
{
niv[x] = lev;
for (auto it : G[x])
DFS (it, lev + 1);
}
int lca (int x, int y)
{
int logx, logy;
if (niv[x] < niv[y])
swap (x, y);
logx = ceil (log2 (niv[x]) );
logy = ceil (log2 (niv[y]) );
//aducem nodul x pe nivel cu y
for (int k = logx; k >= 0 && niv[x] != niv[y]; k--)
if (niv[x] - (1 << k) >= niv[y])
x = T[k][x];
//cautam lca
if (x == y)
return x;
for (int k = logy; k >= 0; k--)
if (T[k][x] && T[k][x] != T[k][y])
{
x = T[k][x];
y = T[k][y];
}
return T[0][x];
}
int main()
{
f >> N >> M;
for (int i = 2; i <= N; i++)
{
f >> T[0][i];
G[T[0][i]].push_back (i);
}
precalcul();
DFS(1, 0);
int x, y;
for (int i = 1; i <= M; i++)
{
f >> x >> y;
g << lca (x, y) << '\n';
}
return 0;
}