Pagini recente » Cod sursa (job #3174350) | Cod sursa (job #1503446) | Cod sursa (job #2550300) | Cod sursa (job #1608545) | Cod sursa (job #1690324)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#define MAX 100003
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
vector<int> vec[MAX];
int euler[3*MAX];
int H[MAX];
int f[MAX];
int k=1;
int rmq[18][MAX*2];
void dfs(int nod, int niv) {
euler[k] = nod;
H[k] = niv;
f[nod] = k;
k++;
for(vector<int>::iterator it = vec[nod].begin(); it != vec[nod].end(); it++) {
dfs(*it, niv+1);
euler[k] = nod;
H[k] = niv;
k++;
}
}
void rm() {
for(int i = 1; i < k; i++)
rmq[0][i] = i;
int lg = log2(k);
for(int i = 1; i <= lg; i++) {
for(int j = 1; j < k; j++) {
rmq[i][j] = rmq[i-1][j];
if(H[rmq[i][j]] > H[rmq[i-1][j+(1<<(i-1))]])
rmq[i][j] = rmq[i-1][j+(1<<(i-1))];
}
}
}
int query(int st, int dr) {
if(st > dr)
swap(st, dr);
int diff = dr-st;
int lg = log2(diff);
int mi = rmq[lg][st];
if(H[mi] > H[rmq[lg][dr-(1<<lg)+1]])
mi = rmq[lg][dr-(1<<lg)+1];
return euler[mi];
}
int main() {
int n,m,x,y;
in >> n >> m;
for(int i = 2; i <= n; i++) {
in >> x;
vec[x].push_back(i);
}
dfs(1, 0);
rm();
for(int i = 1; i <= m; i++) {
in >> x >> y;
out << query(f[x], f[y]) << '\n';
}
return 0;
}