Pagini recente » Cod sursa (job #2971475) | Cod sursa (job #755268) | Cod sursa (job #1780547) | Cod sursa (job #57247) | Cod sursa (job #1690317)
#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;
pair<int, 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].first = H[i];
rmq[0][i].second = euler[i];
}
int lg = log2(k);
for(int i = 1; i <= lg; i++)
for(int j = 1; j < k; j++)
rmq[i][j] = min(rmq[i-1][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);
return min(rmq[lg][st], rmq[lg][st-(1<<lg)+1]).second;
}
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;
}