Pagini recente » Cod sursa (job #2424775) | Cod sursa (job #1549327) | Cod sursa (job #2531755) | Cod sursa (job #147970) | Cod sursa (job #2653864)
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
using namespace std;
vector<vector<int>> c;
vector<int> level, euler, first;
vector<vector<int>> g;
int lca(int x, int y) {
if (first[x] > first[y])
swap(x, y);
int r = x;
for (int i = first[x] + 1;i <= first[y];++i)
if (level[euler[i]] < level[r]) r = euler[i];
return r;
}
void dfs(int u, int l) {
level[u] = l;
euler.push_back(u);
first[u] = euler.size() - 1;
for (auto v : g[u]) {
dfs(v, l + 1);
euler.push_back(u);
}
}
int main() {
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, m;
fin >> n >> m;
g.resize(n + 1);
level.resize(n + 1, -1);
first.resize(n + 1, -1);
for (int i = 2;i <= n;++i) {
int x;
fin >> x;
g[x].push_back(i);
}
dfs(1, 1);
while (m--) {
int x, y;
fin >> x >> y;
fout << lca(x, y) << '\n';
}
return 0;
}