Pagini recente » Cod sursa (job #319201) | Cod sursa (job #378852) | Cod sursa (job #2138763) | Cod sursa (job #1904369) | Cod sursa (job #3148521)
#include<bits/stdc++.h>
using namespace std;
const int nmax = 100005;
int n, m, par[nmax][17], timpul, tin[nmax], tout[nmax];
vector<int>copii[nmax];
void dfs(int s){
tin[s] = ++timpul;
for(auto it : copii[s]){
dfs(it);
}
tout[s] = ++timpul;
}
bool este_stramos(int x, int y){
return (tin[x] < tin[y] && tout[x] > tout[y]);
}
int find_ancestor(int x, int y){
for(int j=16;j>=0;j--){
if(!par[x][j] || este_stramos(par[x][j], y)){
continue;
}else{
x = par[x][j];
}
}
return par[x][0];
}
int main(){
cin >> n >> m;
for(int i=2;i<=n;i++){
int x; cin >> x;
par[i][0] = x;
copii[x].push_back(i);
}
for(int j=1;j<=16;j++){
for(int i=1;i<=n;i++){
par[i][j] = par[par[i][j - 1]][j - 1];
}
}
dfs(1);
// for(int i=1;i<=n;i++){
// cout << tin[i] << ' ' << tout[i] << '\n';
// }
for(int i=1;i<=m;i++){
int x, y;
cin >> x >> y;
cout << find_ancestor(x, y) << '\n';
}
}