Pagini recente » Cod sursa (job #2947507) | Cod sursa (job #282197) | Cod sursa (job #1202315) | Cod sursa (job #1313213) | Cod sursa (job #2565480)
#include<fstream>
#include<vector>
using namespace std;
ifstream in ("lca.in");
ofstream out ("lca.out");
int n,m,stramosi[20][100005],a,b,nivel[100005];
vector<int> v[100005];
int niv (int nod, int level) {
nivel[nod] = level;
for (int i = 0; i < v[nod].size(); i ++) {
niv (v[nod][i], level + 1);
}
}
int main (void) {
in >> n >> m;
for (int i = 2; i <= n; i ++) {
in >> stramosi[0][i];
v[stramosi[0][i]].push_back (i);
}
niv (1,1);
for (int i = 1; i <= 20; i ++) {
for (int j = 1; j <= n; j ++) {
stramosi[i][j] = stramosi[i-1][stramosi[i-1][j]];
}
}
while (m--) {
in >> a >> b;
if (nivel[a] != nivel[b]) {
while (nivel[a] > nivel[b]) {
a = stramosi[0][a];
}
while (nivel[b] > nivel[a]) {
b = stramosi[0][b];
}
}
if (a == b){ out << a <<"\n" ;continue; }
else {
for (int i = 20; i >= 0; i --) {
if (stramosi[i][a] != stramosi[i][b]) {
a = stramosi[i][a];
b = stramosi[i][b];
}
}
out << stramosi[0][a] <<"\n";
}
}
return 0;
}