Pagini recente » Cod sursa (job #2312662) | Cod sursa (job #1967990) | Cod sursa (job #2508299) | Cod sursa (job #2312276) | Cod sursa (job #1967413)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
#define Nmax 100005
int n, m, k;
int Rmq[Nmax << 2][20], L[Nmax << 1], H[Nmax << 1], First[Nmax], Log[Nmax << 1];
vector<int> G[Nmax];
void dfs(int nod, int val) {
L[++k] = val;
H[k] = nod;
First[nod] = k;
for(int y : G[nod]) {
dfs(y, val + 1);
L[++k] = val;
H[k] = nod;
}
}
void process() {
Rmq[1][0] = 1;
for(int i = 2; i <= k; ++i) {
Log[i] = Log[i >> 1] + 1;
Rmq[i][0] = i;
}
for(int j = 1; (1 << j) <= k; ++j)
for(int i = 1; i + (1 << j) - 1 <= k; ++i) {
Rmq[i][j] = Rmq[i][j - 1];
if(L[Rmq[i + (1 << (j - 1))][j - 1]] < L[Rmq[i][j]])
Rmq[i][j] = Rmq[i + (1 << (j - 1))][j - 1];
}
}
int Query(int x, int y) {
x = First[x];
y = First[y];
if(x > y)
swap(x, y);
int diff = y - x + 1;
int lg = Log[diff];
if(L[Rmq[x][lg]] < L[Rmq[y - (1 << lg) + 1][lg]])
return H[Rmq[x][lg]];
return H[Rmq[y - (1 << lg) + 1][lg]];
}
int main()
{
fin >> n >> m;
int x, y;
for(int i = 2; i <= n; ++i) {
fin >> x;
G[x].push_back(i);
}
dfs(1, 0);
process();
for(int i = 1; i <= m; ++i) {
fin >> x >> y;
fout << Query(x, y) << '\n';
}
return 0;
}