#include <stdio.h>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <queue>
#include <cstdlib>
#include <iomanip>
#include <cmath>
//#include <unordered_map>
using namespace std;
#define NMAX 100001
#define ERROR 0.0001
vector <int> tata[NMAX];
int n, m, euler[NMAX], firstAp[NMAX], nivel[NMAX], k;
int i;
void DFS (int nod, int lev)
{
euler[++k] = nod;
nivel[k] = lev;
firstAp[nod] = k;
for (vector<int>::iterator it = tata[nod].begin(); it != tata[nod].end(); it++)
{
DFS (*it, lev + 1);
euler[++k] = nod;
nivel[k] = lev;
}
}
inline int max(int a, int b)
{
if ( a > b )
return a;
return b;
}
inline int min(int a, int b)
{
if ( a < b )
return a;
else
return b;
}
int minim (int x, int y)
{
int mini = euler[x];
int lim = min (x, y);
int lims = max (x, y);
for (int i = lim; i <= lims; i++)
{
if ( mini > euler[i] )
mini = euler[i];
}
return mini;
}
int main ()
{
FILE *f = fopen ("lca.in", "r");
FILE *g = fopen ("lca.out", "w");
int t;
//tata[1].push_back (0);
fscanf (f, "%d %d", &n, &m);
for (int i = 2; i <= n; i++)
{
fscanf (f, "%d", &t);
tata[t].push_back (i);
}
DFS (1, 0);
int x, y;
for (int i = 0; i < m; i++)
{
fscanf (f, "%d %d", &x, &y);
fprintf(g, "%d\n", minim (firstAp[x], firstAp[y]));
}
fclose(f);
fclose(g);
return 0;
}