Pagini recente » DraStiK - infoarena | Diferente pentru preoni-2006/runda-1/solutii intre reviziile 24 si 25 | nofeedbacknolife | Profil DraStiK | Cod sursa (job #2653669)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
vector<int> p, level;
int lca(int x, int y) {
if (level[x] > level[y])
while (level[x] > level[y]) x = p[x];
else if (level[y] > level[x])
while (level[y] > level[x]) y = p[y];
while (x!=y) {
x = p[x];
y = p[y];
}
return x;
}
int findLevel(int root) {
if (level[root] != -1) return level[root];
level[root] = findLevel(p[root]) + 1;
return level[root];
}
int main() {
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, m;
fin >> n >> m;
p.resize(n + 1, -1);
level.resize(n + 1, -1);
for (int i = 2;i <= n;++i) {
int x;
fin >> x;
p[i] = x;
}
level[1] = 0;
for (int i = 2;i <= n;++i)
findLevel(i);
while (m--) {
int x, y;
fin >> x >> y;
fout << lca(x, y) << '\n';
}
return 0;
}