Pagini recente » Cod sursa (job #148100) | Cod sursa (job #2156920) | Cod sursa (job #2259986) | Cod sursa (job #2751807) | Cod sursa (job #2409754)
#include <bits/stdc++.h>
#define DEF 100010
#define INF 1 << 29
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
int n, m, T[DEF], First[DEF];
vector < int > L[DEF];
vector < pair < int, int > > Euler;
void dfs (int nod, int niv) {
Euler.push_back ({nod, niv});
First[nod] = Euler.size () - 1;
for (int it : L[nod]) {
dfs (it, niv + 1);
Euler.push_back ({nod, niv});
}
}
int main () {
fin >> n >> m;
for (int i = 2; i <= n; ++ i) {
fin >> T[i];
L[T[i]].push_back (i);
}
dfs (1, 0);
for (int i = 1; i <= m; ++ i) {
int x, y, minim = INF, nod;
fin >> x >> y;
if (First[x] > First[y]) {
swap (x, y);
}
for (int i = First[x]; i <= First[y]; ++ i) {
if (Euler[i].second < minim) {
minim = Euler[i].second;
nod = Euler[i].first;
}
}
fout << nod << "\n";
}
return 0;
}