Pagini recente » Cod sursa (job #2561499) | Cod sursa (job #618701) | Cod sursa (job #259233) | Cod sursa (job #115350) | Cod sursa (job #2195831)
#pragma GCC optimize("03")
#include <bits/stdc++.h>
#define N 100100
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int n, m, x, y, vf, rmq[19][2 * N], st[2 * N], D[N], ap[N];
bitset <N> viz;
vector <int> v[N];
void dfs(int from, int lvl){
viz[from] = 1;
D[from] = lvl;
st[++vf] = from;
ap[from] = vf;
for(auto to : v[from]){
if(!viz[to]){
dfs(to, lvl + 1);
st[++vf] = from;
}
}
}
int main(){
in >> n >> m;
for(int i = 2; i <= n; i++){
in >> x;
v[x].push_back(i);
}
dfs(1, 1);
for(int i = 1; i <= vf; i++)
rmq[0][i] = st[i];
int sz = log2(vf);
for(int pw = 1; pw <= sz; pw++)
for(int j = 1; j <= vf; j++)
rmq[pw][j] = (D[rmq[pw - 1][j]] < D[rmq[pw - 1][j + (1 << (pw - 1))]] ? rmq[pw - 1][j] : rmq[pw - 1][j + (1 << (pw - 1))]);
while(m--){
in >> x >> y;
if(ap[x] > ap[y])
swap(x, y);
sz = log2(ap[y] - ap[x] + 1);
out << (D[rmq[sz][ap[x]]] < D[rmq[sz][ap[y] - (1 << sz) + 1]] ? rmq[sz][ap[x]] : rmq[sz][ap[y] - (1 << sz) + 1]) << '\n';
}
return 0;
}