Pagini recente » Cod sursa (job #3270287) | Cod sursa (job #1368587) | Cod sursa (job #1955457) | Cod sursa (job #2366344) | Cod sursa (job #2289542)
#include <bits/stdc++.h>
using namespace std;
const int mxn = 100 * 1000 + 10;
vector< int > g[ mxn ];
int v[ 2 * mxn ];
int p = 1;
int rmq[ 20 ][ 2 * mxn ];
int poz[ mxn ];
int n, q;
int pmx;
void euler(int nod){
v[ p++ ] = nod;
poz[ nod ] = p - 1;
if(g[ nod ].size()){
for(auto it: g[ nod ]){
euler( it );
v[ p++ ] = nod;
}
}
}
int main()
{
ifstream cin("lca.in");
ofstream cout("lca.out");
cin>> n >> q;
for(int i = 2, x; i <= n; i++){
cin>> x;
g[ x ].push_back( i );
}
euler( 1 );
p--;
for(int i = 1; i <= p; i++)
rmq[ 0 ][ i ] = v[ i ];
for(int k = 1; (1 << k) < p; k++){
pmx = (1 << k);
for(int i = 1; i + pmx - 1 <= p; i++){
rmq[ k ][ i ] = min(rmq[ k - 1 ][ i ], rmq[ k - 1 ][ i + (pmx >> 1)]);
}
}
for(int i = 1, x, y; i <= q; i++){
cin>> x >> y;
x = poz[ x ];
y = poz[ y ];
if(x > y)
swap(x, y);
int k = log2(y - x + 1);
cout<< min(rmq[ k ][ x ], rmq[ k ][ y - (1 << k) + 1] )<< '\n';
}
return 0;
}