Pagini recente » Cod sursa (job #2481355) | Cod sursa (job #2265198) | Cod sursa (job #1360322) | Cod sursa (job #99444) | Cod sursa (job #1363877)
#include <fstream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int NMAX = 100000;
const int JMAX = 19;
vector <int> G[NMAX+1];
int N,M, E[2*NMAX+1], E_ind = 0, L[2*NMAX+1], Ind[2*NMAX+1];
int rmq[JMAX+1][2*NMAX+2], Log[2*NMAX+2];
bool viz[NMAX+2];
void DFS( int nod, int layer ) {
viz[nod] = 1;
E[ ++E_ind ] = nod;
L[ E_ind ] = layer;
Ind[nod] = E_ind;
for( int i = 0; i < (int)G[nod].size(); ++i ) {
int x = G[nod][i];
if( !viz[x] ) {
DFS(x, layer+1);
E[ ++E_ind ] = nod;
L[ E_ind ] = layer;
}
}
}
void RMQ() {
rmq[0][1] = 1;
Log[1] = 0;
for( int i = 2; i <= E_ind; ++i ) {
rmq[0][i] = i;
Log[i] = Log[ (i >> 1) ] + 1;
}
for( int j = 1; j <= JMAX; ++j ) {
for( int i = 1; i <= E_ind-(1<<j)+1; ++i ) {
if( L[ rmq[j-1][ i ] ] < L[ rmq[j-1][ i+( 1<<(j-1) ) ] ] ) {
rmq[j][i] = rmq[j-1][ i ];
}
else {
rmq[j][i] = rmq[j-1][ i+( 1<<(j-1) ) ];
}
}
}
}
int main() {
in >> N >> M;
for( int i = 2; i <= N; ++i ) {
int nr; in >> nr;
G[nr].push_back(i);
}
DFS(1,0);
RMQ();
E[0] = 1;
for( int i = 1; i <= M; ++i ) {
int x,y;
in >> x >> y;
int sol, st = min( Ind[x], Ind[y] ), dr = max( Ind[x], Ind[y] );
int lg = Log[dr-st+1];
if( L[ rmq[lg][st] ] < L[ rmq[lg][dr - (1<<(lg)) + 1] ] ) {
sol = rmq[lg][st];
}
else {
sol = rmq[lg][dr - (1<<(lg)) + 1];
}
out << E[sol] << '\n';
}
/* for( int i = 1; i <= E_ind; ++i ) out << E[i] << ' ';
out << '\n';
for( int i = 1; i <= E_ind; ++i ) out << Ind[i] << ' ';
out << '\n';
for( int i = 1; i <= E_ind; ++i ) out << L[i] << ' '; */
return 0;
}