Pagini recente » Cod sursa (job #1163508) | Cod sursa (job #317836) | Cod sursa (job #1917425) | Cod sursa (job #2815325) | Cod sursa (job #1690330)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#include <bitset>
#define MAX 100003
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
vector<int> vec[MAX];
int euler[4*MAX];
int H[4*MAX];
int f[4*MAX];
int k;
int rmq[18][MAX*4];
bitset<MAX> viz;
void dfs(int nod, int niv) {
viz[nod] = 1;
euler[++k] = nod;
H[k] = niv;
f[nod] = k;
for(vector<int>::iterator it = vec[nod].begin(); it != vec[nod].end(); it++) {
if(viz[*it])
continue;
dfs(*it, niv+1);
euler[++k] = nod;
H[k] = niv;
}
}
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++) {
if(H[rmq[i-1][j]] < H[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 query(int st, int dr) {
if(st > dr)
swap(st, dr);
int diff = dr-st+1;
int lg = log2(diff);
if(H[rmq[lg][st]] < H[rmq[lg][dr-(1<<lg)+1]])
return euler[rmq[lg][st]];
else
return euler[rmq[lg][dr-(1<<lg)+1]];
}
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;
}