Pagini recente » Cod sursa (job #2470748) | Cod sursa (job #2877047) | Cod sursa (job #2375926) | Cod sursa (job #1495814) | Cod sursa (job #2476433)
#include <bits/stdc++.h>
#define BIT(x) (1<<(x))
using namespace std;
struct El
{
El() {}
El(int h, int n) : h(h), n(n) {}
int h, n;
} rmq[20][200020];
vector<int> g[100010];
int pos[100010];
int lrmq;
void dfs(int n, int h)
{
pos[n] = lrmq;
rmq[0][lrmq++] = El(h, n);
for(int v : g[n])
{
dfs(v, h + 1);
rmq[0][lrmq++] = El(h, n);
}
}
int main() {
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
int n, q;
cin >> n >> q;
for(int i = 2; i <= n; i++)
{
int t;
cin >> t;
g[t].push_back(i);
}
dfs(1, 0);
for(int k = 1; lrmq - BIT(k) + 1 >= 0; k++)
{
for(int i = 0; i < lrmq - BIT(k) + 1; i++)
{
if(rmq[k - 1][i].h < rmq[k - 1][i + BIT(k - 1)].h)
rmq[k][i] = rmq[k - 1][i];
else rmq[k][i] = rmq[k - 1][i + BIT(k - 1)];
}
}
while(q--)
{
int a, b;
cin >> a >> b;
int pa = pos[a];
int pb = pos[b];
if(pa > pb)
swap(pa, pb);
int lg;
for(lg = 20; BIT(lg) > pb - pa + 1; lg--);
El ea = rmq[lg][pa];
El eb = rmq[lg][pb - BIT(lg) + 1];
if(ea.h < eb.h)
cout << ea.n << '\n';
else cout << eb.n << '\n';
}
return 0;
}