Pagini recente » Cod sursa (job #883681) | Cod sursa (job #504365) | Cod sursa (job #2553281) | Cod sursa (job #2411052) | Cod sursa (job #2908120)
#include <fstream>
#include <vector>
using namespace std;
const int N = 1e5;
const int L = 16;
int t[L+1][N+1], ti[N+1], to[N+1], n, timp, emax[N+1];
vector <int> fii[N+1];
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()
{
ifstream in("lca.in");
ofstream out("lca.out");
int nq;
in >> n >> nq;
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 < nq; i++)
{
int x, y;
in >> x >> y;
out << lca(x, y) << "\n";
}
in.close();
out.close();
return 0;
}