Pagini recente » Cod sursa (job #851997) | Cod sursa (job #1533942) | Cod sursa (job #12388) | Cod sursa (job #1714621) | Cod sursa (job #1991358)
#include <stdio.h>
#include <iostream>
#include <vector>
#define MAX 100005
#define NMAX 18
using namespace std;
int n, m, x, y;
vector<int> l[MAX];
int rmq[NMAX][2 * MAX], lvl[2 * MAX];
int log[2 * MAX], e[2 * MAX], esiz, pos[MAX];
void euler(int x, int d){
pos[x] = esiz;
rmq[0][esiz] = esiz;
lvl[esiz] = d;
e[esiz++] = x;
for(int i = 0; i < l[x].size(); ++i){
euler(l[x][i], d + 1);
rmq[0][esiz] = esiz;
lvl[esiz] = d;
e[esiz++] = x;
}
}
void constrRMQ(){
for(int i = 2; i <= esiz; ++i)
log[i] = log[i / 2] + 1;
for(int i = 1; i <= log[esiz]; ++i)
for(int j = 0; j <= esiz - (1<<i); ++j)
if(lvl[rmq[i - 1][j]] < lvl[rmq[i - 1][j + (1<<(i - 1))]])
rmq[i][j] = rmq[i - 1][j];
else
rmq[i][j] = rmq[i - 1][j + (1<<(i - 1))];
}
int lca(int x, int y){
if(x == y)
return x;
int px = pos[x], py = pos[y];
if(px > py)
swap(px, py);
int d = log[py - px + 1];
if(lvl[rmq[d][px]] < lvl[rmq[d][py - (1<<d) + 1]])
return e[rmq[d][px]];
else
return e[rmq[d][py - (1<<d) + 1]];
}
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);
l[x].push_back(i);
}
euler(1, 0);
constrRMQ();
for(int i = 0; i < m; ++i){
scanf("%d%d", &x, &y);
printf("%d\n", lca(x, y));
}
return 0;
}