Pagini recente » Cod sursa (job #794381) | Cod sursa (job #1713508) | Cod sursa (job #709340) | Cod sursa (job #2628577) | Cod sursa (job #2084240)
#include <bits/stdc++.h>
using namespace std;
int n, m, h;
int H[100005], TT[100005], T2[100005];
vector <int> F[100005];
inline void dfs(int nod, int t2, int lev){
T2[nod] = t2;
H[nod] = lev;
if(lev % h == 0) t2 = nod;
for(auto it : F[nod])
dfs(it, t2, lev + 1);
}
inline int lca(int x, int y){
while(T2[x] != T2[y]){
if(H[x] > H[y]) x = T2[x];
else y = T2[y];
}
while(x != y){
if(H[x] > H[y]) x = TT[x];
else y = TT[y];
}
}
int main(){
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 2; i <= n ; ++i) {
scanf("%d", &TT[i]);
F[TT[i]].push_back(i);
}
h = 200;
dfs(1, 0, 0);
int x, y;
for(int i = 1; i <= m ; ++i){
scanf("%d%d", &x, &y);
printf("%d\n", lca(x, y));
}
return 0;
}