Pagini recente » Cod sursa (job #1443240) | Cod sursa (job #2335115) | Cod sursa (job #1459625) | Cod sursa (job #14313) | Cod sursa (job #2476439)
#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() {
ifstream cin("lca.in");
ofstream cout("lca.out");
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;
int diff = pb - pa + 1;
for(lg = 20; BIT(lg) > diff; 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;
}