Pagini recente » Cod sursa (job #2922256) | Cod sursa (job #1363377) | Cod sursa (job #1898433) | Cod sursa (job #109941) | Cod sursa (job #2979628)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
const int MAX = 1e5;
int poz[MAX+1] , niv[MAX+1], k , n , m , t , nivel , log[2*MAX+2] , a , b;
int rmq[18][2*MAX+2];
vector <int> g[MAX+1];
void dfseuler( int x ){
++nivel;
niv[x] = nivel;
rmq[0][++k] = x;
poz[x] = k;
for(auto it : g[x]){
dfseuler(it);
rmq[0][++k] = x;
}
--nivel;
}
// rmq[i][j] = minimul din intervalul (j , j + (1<<i) - 1)
int main(){
cin >> n >> m;
for(int i = 2 ; i <= n ; i++){
cin >> t;
g[t].push_back(i);
}
dfseuler(1);
log[0] = -1;
int ne = n*2 - 1;
for(int i = 1 ; i <= ne ; i++){
log[i] = log[i/2] + 1;
}
for(int i = 1 ; i <= log[ne] ; i++ ){
for(int j = 1 ; j + (1<<i) - 1 <= ne ; j++){
if(niv[rmq[i-1][j]] < niv[rmq[i-1][j+(1<<(i-1))]]){
rmq[i][j] = rmq[i-1][j];
}else rmq[i][j] = rmq[i-1][j+(1<<(i-1))];
}
}
while(m--){
cin >> a >> b;
a = poz[a] , b = poz[b];
if(b<a) swap(a,b);
int l = b-a+1;
l =log[l];
cout << min(rmq[l][a],rmq[l][b-(1<<l)+1]) << '\n';
}
return 0;
}