Pagini recente » Cod sursa (job #2746752) | Cod sursa (job #1644908) | Cod sursa (job #2989165) | Cod sursa (job #1348595) | Cod sursa (job #1998740)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int MAXN = 1e5 + 5;
int n, m;
int dp[18][MAXN], level[MAXN], log[MAXN];
vector<int> g[MAXN];
void preprocess() {
for (int k = 2; k <= 17; ++k) {
for (int nod = 1; nod <= n; ++nod) {
dp[k][nod] = dp[k-1][dp[k-1][nod]];
}
}
}
void set_log() {
int next = 2;
int lg = 0;
for (int i = 1; i <= n; ++i) {
if (i == next) {
lg++;
next *= 2;
log[i] = lg;
} else log[i] = lg + 1;
}
}
void set_level(int x, int depth) {
level[x] = depth;
for (int i = 0; i < g[x].size(); ++i) {
set_level(g[x][i], depth + 1);
}
}
int query(int x, int y) {
if (level[x] != level[y]) {
if (level[x] < level[y]) swap(x, y);
int bit = log[level[x]];
while (bit) {
if (level[dp[bit][x]] >= level[y]) {
x = dp[bit][x];
}
bit--;
}
}
if (x == y) return x;
int bit = log[level[y]];
while (bit) {
if (dp[bit][x] != dp[bit][y]) {
x = dp[bit][x];
y = dp[bit][y];
}
bit--;
}
return dp[1][x];
}
int main()
{
in >> n >> m;
for (int i = 2; i <= n; ++i) {
in >> dp[1][i];
g[dp[1][i]].push_back(i);
}
preprocess();
set_level(1, 1);
set_log();
for (int i = 1, x, y; i <= m; ++i) {
in >> x >> y;
out << query(x, y) << "\n";
}
return 0;
}