Pagini recente » Cod sursa (job #2177805) | Cod sursa (job #2230822) | Cod sursa (job #1995152) | Cod sursa (job #777031) | Cod sursa (job #1932709)
#include <cstdio>
#include <vector>
#include <algorithm>
#define NMAX 100005
#define LMAX 20
#define pb push_back
#define minim(a, b) a <= b ? a : b
using namespace std;
FILE *f = freopen("lca.in", "r", stdin);
FILE *g = freopen("lca.out", "w", stdout);
int L[NMAX <<1], Lg[NMAX << 1], H[NMAX << 1], First[NMAX];
int Rmq[LMAX][NMAX << 2];
vector <int> G[NMAX];
int N, M, K;
void readData() {
scanf("%d%d", &N, &M);
for(int i = 2; i<=N; i++)
{
int x;
scanf("%d", &x);
G[x].pb(i);
}
}
void dfs(int nod, int lev) {
H[++K] = nod;
L[K] = lev;
First[nod] = K;
for(int i = 0; i<G[nod].size(); i++)
{
dfs(G[nod][i], lev + 1);
H[++K] = nod;
L[K] = lev;
}
}
void rmq() {
Lg[1] = 0;
for(int i = 2; i<=K; i++)
Lg[i] = Lg[i / 2] + 1;
for(int i = 1; i<=K; i++)
Rmq[0][i] = i;
for(int i = 1; i<=Lg[K]; i++)
for(int j = 1; j<= K - 1 <<(i - 1); j++)
Rmq[i][j] = L[Rmq[i - 1][j]] < L[Rmq[i - 1][j + (1 <<(i - 1))]] ? Rmq[i - 1][j] : Rmq[i - 1][j + (1 << (i - 1))];
}
int lca(int x, int y) {
int X = First[x], Y = First[y];
if(X > Y) swap(X, Y);
int K = Lg[Y - X + 1];
int sol = L[Rmq[K][X]] < L[Rmq[K][Y - (1 << K) + 1]] ? Rmq[K][X] : Rmq[K][Y - (1 << K) + 1];
return H[sol];
}
int main() {
readData();
dfs(1, 0);
rmq();
for(int i = 1; i<=M; i++) {
int x, y;
scanf("%d%d", &x, &y);
printf("%d\n", lca(x, y));
}
return 0;
}