Pagini recente » Cod sursa (job #2318114) | Cod sursa (job #2990926) | Cod sursa (job #2455268) | Cod sursa (job #1085763) | Cod sursa (job #2236188)
#include<bits/stdc++.h>
using namespace std;
#define MAX 100005
int niv[MAX * 2] , rmq[MAX * 2][18] , first[MAX * 2] , euler[2 * MAX] ,aux[MAX * 2];
vector<int> graf[MAX];
int k , n ;
void dfs_euler(int nod){
euler[k++] = nod ;
first[nod] = k-1 ;
for(auto it : graf[nod]){
niv[it] = niv[nod] + 1 ;
dfs_euler(it);
euler[k++] = nod ;
}
}
void RMQ(){
for(int i = 0 ; i < k ; i ++)
aux[i] = niv[euler[i]];
for(int i = 0 ; i < k ; i ++)
rmq[i][0] = i;
for(int j = 1 ; (1 << j) <= k ; j ++){
int i;
for(i = 0 ; i + (1 << j ) - 1 < k ; i ++)
if(aux[rmq[i][j-1]] < aux[rmq[i + (1 << j - 1)][j-1]])
rmq[i][j] = rmq[i][j-1];
else
rmq[i][j] = rmq[i + (1 << j - 1)][j-1];
// cout << i << " ";
}
}
int query(int left , int right){
int a= first[left];
int b = first[right];
if(a>b) swap(a,b);
int l = (b-a) + 1 ;
l = (int)log2(l) ;
if(aux[rmq[a][l]] < aux[rmq[b - (1 << l) + 1][l]])
return euler[rmq[a][l]];
else
return euler[rmq[b - (1 << l) + 1][l]];
}
int main(){
int q ;
ifstream in("rmq.in");
ofstream out("rmq.out");
in >> n >> q ;
for(int i = 1 ; i < n ; i ++){
int x ;
in >> x;
graf[x].push_back(i+1);
}
dfs_euler(1);
RMQ();
int x , y ;
while(q--){
in >> x >> y ;
out << query(x,y) << '\n';
}
for(int i = 0 ; i <= k ; i ++ )
out << first[i] << " ";
}