Pagini recente » Cod sursa (job #1743187) | Cod sursa (job #2701842)
#include <bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
// #define f cin
// #define g cout
int n, ka, depth[100009], rmq[19][200009], first[100009];
vector<vector<int>> v;
int query(int, int);
struct aaa
{
int dep, nr;
} a[200009];
void dfs(int);
void build_rmq();
int main()
{
ios_base::sync_with_stdio(false);
f.tie(nullptr);
g.tie(nullptr);
int q;
f >> n >> q;
v.resize(n + 1);
for (int i = 2, x; i <= n; i++)
f >> x, v[x].emplace_back(i), v[i].emplace_back(x);
depth[1] = 1;
dfs(1);
build_rmq();
for (int x, y; q; q--)
f >> x >> y, g << query(x, y) << '\n';
return 0;
}
void dfs(int x)
{
a[++ka].nr = x;
a[ka].dep = depth[x];
if (!first[x])
first[x] = ka;
for (const auto &i : v[x])
if (!depth[i])
depth[i] = depth[x] + 1, dfs(i), a[++ka].nr = x, a[ka].dep = depth[x];
}
void build_rmq()
{
for (int i = 1; i <= ka; i++)
rmq[0][i] = i;
for (int i = 1, pd = 1; (1 << i) <= ka; i++, pd <<= 1)
for (int j = 1; j + (1 << i) - 1 <= ka; j++)
if (a[rmq[i - 1][j]].dep < a[rmq[i - 1][j + pd]].dep)
rmq[i][j] = rmq[i - 1][j];
else
rmq[i][j] = rmq[i - 1][j + pd];
}
int query(int x, int y)
{
x = first[x];
y = first[y];
int t = log2(y - x + 1);
int rez;
if (a[rmq[t][x]].dep < a[rmq[t][y - (1 << t) + 1]].dep)
return a[rmq[t][x]].nr;
return a[rmq[t][y - (1 << t) + 1]].nr;
}