Pagini recente » Cod sursa (job #2422186) | Cod sursa (job #1816272) | Cod sursa (job #2699920) | Cod sursa (job #2668154) | Cod sursa (job #3030687)
#include <bits/stdc++.h>
#define int long long
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int n, q;
const int N = 1e5 + 5;
int euler[2 * N], timp, prima[N];
int niv[N];
vector <int> g[N];
void dfs(int nod, int nivel)
{
timp++;
euler[timp] = nod;
prima[nod] = timp;
niv[nod] = nivel;
for(auto it:g[nod])
{
dfs(it, nivel + 1);
euler[++timp] = nod;
}
}
int cmp(int x, int y)
{
return niv[x] < niv[y];
}
int rmq[20][N];
int lg[N];
signed main()
{
in >> n >> q;
for(int i = 2; i <= n; i++)
{
int x;
in >> x;
g[x].push_back(i);
}
dfs(1, 1);
for (int i = 1; i <= timp; i++)
{
rmq[0][i] = euler[i];
if (i > 1)
{
lg[i] = lg[i / 2] + 1;
}
}
for (int e = 1; (1 << e) <= timp; e++)
{
for (int i = 1; i + (1 << (e - 1)) - 1 <= timp; i++)
{
rmq[e][i] = min(rmq[e - 1][i], rmq[e - 1][i + (1 << (e - 1))], cmp);
}
}
while(q--)
{
int x, y;
in >> x >> y;
x = prima[x];
y = prima[y];
if (x > y)
{
swap(x, y);
}
int diff = y - x + 1, e = lg[diff];
out << min(rmq[e][x], rmq[e][y - (1 << e) + 1], cmp) << '\n';
}
return 0;
}