Pagini recente » Cod sursa (job #710027) | Cod sursa (job #2396800) | Cod sursa (job #108872) | Cod sursa (job #482602) | Cod sursa (job #2351739)
#include <bits/stdc++.h>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int n, m, x, y, dad[100100], dp[20][100100], niv[100100], viz[100100];
vector <int> v[100100];
void dfs(int x, int lvl) {
viz[x] = 1;
niv[x] = lvl;
for (auto y : v[x])
if (!viz[y])
dfs(y, lvl + 1);
}
void build() {
for (int i = 1; i <= n; i++)
dp[0][i] = dad[i];
for (int i = 1; i <= 16; i++)
for (int j = 1; j <= n; j++)
dp[i][j] = dp[i - 1][dp[i - 1][j]];
}
void solve(int x, int y) {
if (niv[x] < niv[y])
swap(x, y);
int d = niv[x] - niv[y];
for (int i = 0; i <= 16; i++)
if (d & (1 << i))
x = dp[i][x];
for (int i = 16; i >= 0; i--)
if (dp[i][x] != dp[i][y]) {
x = dp[i][x];
y = dp[i][y];
}
if (x != y)
x = dad[x];
out << x << '\n';
}
int main() {
in >> n >> m;
for (int i = 2; i <= n; i++) {
in >> x;
dad[i] = x;
v[x].push_back(i);
}
dfs(1, 1);
build();
while (m--) {
in >> x >> y;
solve(x, y);
}
return 0;
}