Pagini recente » Cod sursa (job #853394) | Cod sursa (job #840606) | Cod sursa (job #1461991) | Borderou de evaluare (job #2017515) | Cod sursa (job #2093093)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
void Dfs(int cur_node, int cur_level, vector < int > &level,
vector < vector < int > > &gr) {
level[cur_node] = cur_level;
for (auto x : gr[cur_node]) {
Dfs(x, cur_level + 1, level, gr);
}
}
int main() {
int n, m;
cin >> n >> m;
vector < int > tata(n + 1);
vector < int > level(n + 1);
vector < vector < int > > gr(n + 1);
for (int i = 2; i <= n; i ++) {
cin >> tata[i];
gr[tata[i]].push_back(i);
}
Dfs(1, 1, level, gr);
int lim = log2(n);
vector < vector < int > > dp(lim + 1, vector < int > (n + 1));
for (int i = 1; i <= n; i ++) {
dp[0][i] = tata[i];
}
for (int j = 1; j <= lim; j ++) {
for (int i = 1; i <= n; i ++) {
dp[j][i] = dp[j - 1][dp[j - 1][i]];
}
}
for (int i = 1; i <= m; i ++) {
int x, y;
cin >> x >> y;
if (level[x] > level[y]) {
swap(x, y);
}
int dif = level[y] - level[x];
int bit = 0;
while (dif) {
if (dif & 1) {
y = dp[bit][y];
}
dif >>= 1;
bit += 1;
}
for (int i = lim; i >= 0; i --) {
if (dp[i][x] != dp[i][y]) {
x = dp[i][x];
y = dp[i][y];
}
}
if (x != y) {
cout << tata[x] << '\n';
}
else {
cout << x << '\n';
}
}
}