Pagini recente » Cod sursa (job #2206473) | Cod sursa (job #3265818) | Cod sursa (job #2206322) | Cod sursa (job #3145378) | Cod sursa (job #1959462)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
#define Nmax 100005
int n, m, x, y, k;
int Rmq[4 * Nmax][20], L[2 * Nmax], Log[2 * Nmax], H[2 * Nmax], First[Nmax];
vector<int> G[Nmax];
void Process() {
Rmq[1][0] = 1;
for(int i = 2; i <= k; ++i) {
Log[i] = Log[i / 2] + 1;
Rmq[i][0] = i;
}
int p;
for(int j = 1; (1 << j) < k; ++j)
for(int i = 1; i + (1 << j) <= k; ++i) {
p = 1 << (j - 1);
Rmq[i][j] = Rmq[i][j - 1];
if(L[Rmq[i + p][j - 1]] < L[Rmq[i][j]])
Rmq[i][j] = Rmq[i + p][j - 1];
}
}
int Query(int x, int y) {
x = First[x];
y = First[y];
if(x > y) {
int aux = x;
x = y;
y = aux;
}
int diff = y - x + 1;
int lg = Log[diff];
int sol = Rmq[x][lg];
if(L[sol] > L[Rmq[y - (1 << lg) + 1][lg]])
sol = Rmq[y - (1 << lg) + 1][lg];
return H[sol];
}
void Dfs(int nod, int val) {
H[++k] = nod;
L[k] = val;
First[nod] = k;
for(int y : G[nod]) {
Dfs(y, val + 1);
H[++k] = nod;
L[k] = val;
}
}
int main()
{
fin >> n >> m;
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;
}