Pagini recente » Cod sursa (job #2120097) | Cod sursa (job #2529410) | Cod sursa (job #2734160) | Cod sursa (job #2510715) | Cod sursa (job #1450875)
#include <cstdio>
#include <algorithm>
#include <vector>
#define DIM 222222
using namespace std;
int N, M, i, j, A[20][DIM], K, k, X, Y;
int NIV[DIM], EUL[DIM], P[DIM];
vector <int> V[DIM];
void BFS(int nod, int dep){
K ++;
EUL[K] = nod;
NIV[K] = dep;
P[nod] = K;
for(int i = 0; i < V[nod].size(); i ++){
int vec = V[nod][i];
BFS(vec, dep + 1);
K ++;
EUL[K] = nod;
NIV[K] = dep;
P[nod] = K;
}
return;
}
int main(){
freopen("lca.in" ,"r", stdin );
freopen("lca.out","w", stdout);
scanf("%d %d", &N, &M);
for(int i = 2; i <= N; i ++){
scanf("%d", &X);
V[X].push_back(i);
}
BFS(1, 0);
for(int i = 1; i <= K; i ++)
A[0][i] = i;
for(int k = 1; (1<<k) <= K; k ++){
for(int i = 1; i <= K; i ++){
int j = i + (1<<(k-1));
A[k][i] = A[k-1][i];
if(j <= K)
if(NIV[A[k-1][j]] < NIV[A[k-1][i]])
A[k][i] = A[k-1][j];
}
}
/*
for(int i = 1; i <= K; i ++)
printf("%d ", NIV[i]);
printf("\n");
for(int k = 0; (1<<k) <= K; k ++){
printf("\n");
for(int i = 1; i <= K; i ++)
printf("%d ", A[k][i]);
}
*/
for(int i = 1; i <= M; i ++){
scanf("%d %d", &X, &Y);
X = P[X]; Y = P[Y];
if(X > Y) swap(X, Y);
int dist = Y - X + 1, k;
for(k = 0; (1<<k) <= dist; k ++); k --;
if(NIV[A[k][X]] <= NIV[A[k][Y-(1<<k)+1]])
printf("%d\n", EUL[A[k][X]]);
else
printf("%d\n", EUL[A[k][Y-(1<<k)+1]]);
}
return 0;
}