Pagini recente » Cod sursa (job #2188364) | Cod sursa (job #634626) | Cod sursa (job #2297759) | Cod sursa (job #1179058) | Cod sursa (job #1991345)
#include <iostream>
#include <vector>
#define MAX 100005
#define NMAX 18
using namespace std;
int n, m, x, y, e[2 * MAX], esiz, pos[MAX], lvl[MAX];
vector<int> l[MAX];
int rmq[NMAX][2 * MAX];
int log[2 * 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);
cin >> n >> m;
for(int i = 2; i <= n; ++i){
cin >> x;
l[x].push_back(i);
}
euler(1, 0);
constrRMQ();
for(int i = 0; i < m; ++i){
cin >> x >> y;
cout << lca(x, y) << "\n";
}
return 0;
}