Pagini recente » Cod sursa (job #3161478) | Cod sursa (job #3144682) | Cod sursa (job #3166855) | Cod sursa (job #576336) | Cod sursa (job #2092523)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("lca.in");
ofstream cout("lca.out");
void Dfs(int node, int cur_lvl, vector < int > &level, vector < vector < int > > &gr) {
level[node] = cur_lvl;
for (auto x : gr[node]) {
Dfs(x, cur_lvl + 1, level, gr);
}
}
int main() {
int n, m;
cin >> n >> m;
vector < int > root(n + 1);
vector < vector < int > > gr(n + 1);
for (int i = 2; i <= n; i ++) {
cin >> root[i];
gr[root[i]].push_back(i);
}
vector < int > level(n + 1);
Dfs(1, 1, level, gr);
for (int i = 1; i <= m; i ++) {
int x, y;
cin >> x >> y;
while (x != y) {
if (level[x] >= level[y]) {
x = root[x];
}
else {
y = root[y];
}
}
cout << x << '\n';
}
}