Pagini recente » Cod sursa (job #2820560) | Cod sursa (job #3246318) | Cod sursa (job #3193448) | Cod sursa (job #3195579) | Cod sursa (job #2979271)
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
ifstream f("lca.in");
ofstream g("lca.out");
const int N = 1e5 + 5;
int n, m, k, tata[N], first[N], nivel[N], rmq[18][2 * N];
vector<int> fii[N], stk;
void init(), read(), euler(), build_rmq(), solve_queries();
int main()
{
init();
solve_queries();
return 0;
}
void init(){
read();
euler();
build_rmq();
}
void read(){
f >> n >> m;
for (int i = 2; i <= n; i++) {
f >> tata[i];
fii[tata[i]].pb(i);
}
}
void euler(){
stk.pb(1); nivel[1] = 0;
while (stk.size()){
int nod = stk.back(); stk.pop_back();
rmq[0][++k] = nod; if (!first[nod]) first[nod] = k;
if (fii[nod].size()){
int fiu = fii[nod].back(); fii[nod].pop_back();
nivel[fiu] = nivel[nod] + 1; stk.pb(nod); stk.pb(fiu);
}
}
}
void build_rmq(){
for (int i = 1, p = 2; p <= k; i++, p *= 2){
for (int j = 1; j + p / 2 <= k; j++)
if (nivel[rmq[i - 1][j]] < nivel[rmq[i - 1][j + p / 2]])
rmq[i][j] = rmq[i - 1][j];
else rmq[i][j] = rmq[i - 1][j + p / 2];
}
}
void solve_queries(){
int a, b;
for (; m; m--){
f >> a >> b;
a = first[a]; b = first[b];
if (a > b) swap(a, b);
int l = b - a;
l = 31 - __builtin_clz(l);
if (nivel[rmq[l][a]] < nivel[rmq[l][b - (1 << l) + 1]]) g << rmq[l][a] << '\n';
else g << rmq[l][b - (1 << l) + 1] << '\n';
}
}