#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int N=1+1e5;
//Algoritm scris de Trita Nichita, 6 iunie 2014, la 11:41 AM GMT+2
struct Nod{
int t,i,o;
} noduri[N];
vector<int> g[N];
int t,n,q,a,b;
bool este(int a, int b){
return ((a==b) || (noduri[a].i<noduri[b].i && noduri[a].o>noduri[b].o));
}
void dfs(int p){
noduri[p].i=++t;
for(int i=0 ; i<g[p].size() ; i++){
dfs(g[p][i]);
}
noduri[p].o=++t;
}
int lca(int a, int b){
if(este(a,b)){
return a;
}
if(este(b,a)){
return b;
}
return lca(noduri[a].t,noduri[b].t);
}
int main()
{
in>>n>>q;
for(int i=2 ; i<=n ; i++){
in>>noduri[i].t;
g[noduri[i].t].push_back(i);
}
dfs(1);
for(int i=1 ; i<=q ; i++){
in>>a>>b;
out<<lca(a,b)<<'\n';
}
return 0;
}