Pagini recente » Cod sursa (job #143898) | Cod sursa (job #792633) | Cod sursa (job #2730880) | Cod sursa (job #91100) | Cod sursa (job #3297838)
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#include <bits/stdc++.h>
using namespace std;
const string nume = "lca.";
ifstream fin(nume + "in");
ofstream fout(nume + "out");
#define cin fin
#define cout fout
#define pb push_back
#define pii pair<int, int>
#define fr first
#define sd second
const int M = (int)1e5;
int n, q, a, f[M + 5], x, y;
bool viz[M + 5];
vector<int> v[M + 5];
vector<pii> euler, rmq[20];
void dfs(int x, int h) {
viz[x] = true;
euler.pb({x, h});
f[x] = euler.size();
for (int i : v[x]) {
if (!viz[i]) {
dfs(i, h + 1);
euler.pb({x, h});
}
}
}
pii MIN(pii a, pii b) {
return a.sd > b.sd ? b : a;
}
signed main() {
cin >> n >> q;
for (int i = 1; i < n; ++i) {
cin >> a;
v[a].pb(i + 1);
v[i + 1].pb(a);
}
dfs(1, 1);
int tot = euler.size();
for (int i = 0; i < tot; ++i) {
rmq[0].pb({euler[i].fr, euler[i].sd});
}
int sz = log2(tot);
for (int i = 1; i <= sz; ++i) {
tot -= (1 << (i - 1));
for (int j = 1; j <= tot; ++j) {
rmq[i].pb(MIN(rmq[i - 1][j - 1], rmq[i - 1][j - 1 + (1 << (i - 1))]));
}
}
for (int i = 1; i <= q; ++i) {
cin >> x >> y;
int mx = max(f[x], f[y]), mn = min(f[x], f[y]);
int d = mx - mn + 1, p = 1, e = 0;
while (p <= d) {
p <<= 1;
e++;
}
p >>= 1;
e--;
cout << MIN(rmq[e][mn - 1], rmq[e][mx - p]).fr << "\n";
}
}