Pagini recente » Cod sursa (job #878638) | Cod sursa (job #1808198) | Cod sursa (job #3033468) | Cod sursa (job #1543347) | Cod sursa (job #2909080)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int NMAX = 1e5 + 1;
const int L = 16;
int ti[NMAX], to[NMAX], timp, t[L + 1][NMAX], emax[NMAX];
vector <int> fii[NMAX];
void dfs(int x)
{
ti[x] = ++timp;
for (auto y: fii[x])
{
dfs(y);
}
to[x] = ++timp;
}
bool este_stramos(int x, int y)
{
return(ti[x] <= ti[y] && to[y] <= to[x]);
}
int lca(int x, int y)
{
if (este_stramos(x, y))
{
return x;
}
for (int e = emax[x]; e >= 0; e--)
{
if (t[e][x] != 0 && !este_stramos(t[e][x], y))
{
x = t[e][x];
}
}
return t[0][x];
}
int main()
{
int n, m;
in >> n >> m;
for (int i = 2; i <= n; i++)
{
in >> t[0][i];
fii[t[0][i]].push_back(i);
}
for (int e = 1; (1 << e) <= n; e++)
{
for (int i = 1; i <= n; i++)
{
t[e][i] = t[e - 1][t[e - 1][i]];
if (t[e][i] != 0)
{
emax[i] = e;
}
}
}
dfs(1);
for (int i = 0; i < m; i++)
{
int x, y;
in >> x >> y;
out << lca(x, y) << "\n";
}
return 0;
}