#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int N, M, i, j, RMQ[41][500001], V, First[100001];
vector<int> Graph[100001];
void Euler(int node);
void RMP();
int main()
{
fin>>N>>M;
for(i=1; i<=N; ++i) Graph[i].push_back(0);
for(i=2; i<=N; ++i){
int s;
fin>>s;
Graph[s].push_back(i);
++Graph[s][0];
}
RMQ[0][++V]=1; First[1]=1;
Euler(1);
RMP();
for(i=1; i<=M; ++i){
int a, b, k;
fin>>a>>b;
a=First[a]; b=First[b];
k=log2(b-a+1);
fout<<min(RMQ[k][a], RMQ[k][b-(1<<k)+1])<<"\n";
}
return 0;
}
void Euler(int node){
int i;
for(i=1; i<=Graph[node][0]; ++i){
RMQ[0][++V]=Graph[node][i];
if(First[Graph[node][i]]==0) First[Graph[node][i]]=V;
Euler(Graph[node][i]);
RMQ[0][++V]=node;
}
return;
}
void RMP(){
for(j=1; (1<<j)<=V; ++j)
for(i=1; i<=V; ++i) RMQ[j][i]=min(RMQ[j-1][i], (i+(1<<(j-1))<=V?RMQ[j-1][i+(1<<(j-1))]:100001));
return;
}