Pagini recente » Monitorul de evaluare | Istoria paginii utilizator/anaana123456789 | Istoria paginii runda/moisil2009-5-8/clasament | Clasament dragos12 | Cod sursa (job #2720006)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
const int NMAX = 100001;
int n, m, tree[NMAX], level[NMAX];
vector < int > G[NMAX];
void dfs(int node, int l) {
level[node] = l;
for(auto& it : G[node])
dfs(it, l + 1);
}
int main() {
f >> n >> m;
for(int i = 2;i <= n;++i) {
f >> tree[i];
G[ tree[i] ].push_back(i);
}
dfs(1, 0);
for(;m--;) {
int x, y;
f >> x >> y;
for(;level[x] != level[y];) {
if(level[x] > level[y])
x = tree[x];
else
y = tree[y];
}
for(;x != y;) {
x = tree[x];
y = tree[y];
}
g << x << '\n';
}
return 0;
}