Pagini recente » Cod sursa (job #1230021) | Cod sursa (job #1054209) | Cod sursa (job #3249434) | Cod sursa (job #2886277) | Cod sursa (job #3200497)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, q, i, j, x, y;
int niv[100002], t[100002];
set<int> a[100002];
static inline void PrecalcNiv(int nod = 1, int level = 1) {
niv[nod] = level;
for(auto it : a[nod]) PrecalcNiv(it, level + 1);
}
static inline int Lca(int x, int y) {
if(niv[x] < niv[y]) swap(x, y);
while(niv[x] > niv[y]) x = t[x];
while(x != y) {
x = t[x];
y = t[y];
}
return x;
}
int main() {
fin >> n >> q;
for(i = 2; i <= n; i++) {
fin >> t[i];
a[t[i]].insert(i);
}
PrecalcNiv();
while(q--) {
fin >> x >> y;
fout << Lca(x, y) << "\n";
}
return 0;
}