Pagini recente » Cod sursa (job #2308640) | Profil Tzappy90 | Cod sursa (job #125556) | Clasament dupa rating | Cod sursa (job #1991344)
#include <iostream>
#include <vector>
#define pii pair<int, int>
#define mk make_pair
#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];
pii rmq[NMAX][2 * MAX];
int log[2 * MAX];
void euler(int x, int d){
pos[x] = esiz;
rmq[0][esiz] = mk(x, d);
e[esiz++] = x;
lvl[x] = d;
for(int i = 0; i < l[x].size(); ++i){
euler(l[x][i], d + 1);
rmq[0][esiz] = mk(x, d);
e[esiz++] = x;
}
}
void constrRMQ(){
for(int i = 1; i <= log[esiz]; ++i)
for(int j = 0; j <= esiz - (1<<i); ++j)
if(rmq[i - 1][j].second < rmq[i - 1][j + (1<<(i - 1))].second)
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(rmq[d][px].second < rmq[d][py - (1<<d) + 1].second)
return rmq[d][px].first;
else
return rmq[d][py - (1<<d) + 1].first;
}
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);
for(int i = 2; i <= esiz; ++i)
log[i] = log[i / 2] + 1;
constrRMQ();
for(int i = 0; i < m; ++i){
cin >> x >> y;
cout << lca(x, y) << "\n";
}
return 0;
}