Pagini recente » Cod sursa (job #2337134) | Cod sursa (job #1188702) | Cod sursa (job #2121006) | Cod sursa (job #604009) | Cod sursa (job #1998747)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int MAXN = 1e5 + 5;
int n, m;
int level[MAXN], parent[MAXN];
vector<int> g[MAXN];
void set_level(int x, int depth) {
level[x] = depth;
for (int i = 0; i < g[x].size(); ++i) {
set_level(g[x][i], depth + 1);
}
}
int query(int x, int y) {
while (x != y) {
if (level[x] < level[y]) swap(x, y);
x = parent[x];
}
return x;
}
int main()
{
in >> n >> m;
parent[1] = 0;
level[0] = 0;
for (int i = 2, x; i <= n; ++i) {
in >> x;
parent[i] = x;
g[x].push_back(i);
}
set_level(1, 1);
for (int i = 1, x, y; i <= m; ++i) {
in >> x >> y;
out << query(x, y) << "\n";
}
return 0;
}