Pagini recente » Cod sursa (job #3208438) | Cod sursa (job #3257202) | Cod sursa (job #2878919) | Cod sursa (job #1500504) | Cod sursa (job #3140211)
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int sze = 100000;
int rmq[4 * sze][34];
int L[4 * sze];
int E[4 * sze + 1];
int H[sze + 1];
int N;
vector<int> G[sze + 1];
void RMQ(int RMQ_SIZE) {
for (int i = 0; i < RMQ_SIZE; ++i) rmq[i][0] = i;
int a, b;
for (int j = 1; (1 << j) <= RMQ_SIZE; ++j) {
for (int i = 0; i < RMQ_SIZE - (1 << j) + 1; ++i) {
a = rmq[i][j - 1];
b = rmq[i + (1 << (j - 1))][j - 1];
if (L[a] <= L[b]) rmq[i][j] = a;
else rmq[i][j] = b;
}
}
}
int queryRmq(int a, int b) {
--a;
--b;
if (b < a) swap(a, b);
int k = log2(b - a + 1);
if (L[rmq[a][k]] <= L[rmq[b - (1 << k) + 1][k]]) return rmq[a][k] + 1;
return rmq[b - (1 << k) + 1][k] + 1;
}
int e_cnt = 0;
void SRD(int x, int nivel) {
L[e_cnt] = nivel;
E[++e_cnt] = x;
if(H[x] == 0) H[x] = e_cnt;
for (int i : G[x]) {
SRD(i, nivel + 1);
L[e_cnt] = nivel;
E[++e_cnt] = x;
}
}
int main() {
int m;
fin >> N >> m;
int x;
for (int i = 2; i <= N; ++i) {
fin >> x;
G[x].pb(i);
}
SRD(1, 0);
RMQ(2 * N - 1);
int a, b;
while (m--) {
fin >> a >> b;
fout << E[queryRmq(H[a], H[b])]<<"\n";
}
return 0;
}