#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#define MAXN 100010
#define left (n << 1)
#define right (left + 1)
#define mid ((l + r) >> 1)
using namespace std;
int N, M, no, val, pos, a, b, ans = (1 << 30), Beg[2 * MAXN], T[4 * MAXN];
vector <int> list[MAXN];
inline int min(int a, int b) { return a < b ? a : b; }
void update(int n = 1, int l = 1, int r = 2 * N - 1){
if (l == r){
T[n] = val;
return;
}
if (pos <= mid) update(left, l, mid);
else update(right, mid + 1, r);
T[n] = min(T[left], T[right]);
}
void query(int n = 1, int l = 1, int r = 2 * N - 1){
if (a <= l && r <= b){
ans = min(ans, T[n]);
return;
}
if (a <= mid) query(left, l, mid);
if (b > mid) query(right, mid + 1, r);
}
void DFS(int n = 1){
Beg[n] = ++no;
pos = no, val = n;
update();
for (int i = 0; i < (int)list[n].size(); ++i)
DFS(list[n][i]),
pos = ++no, val = n, update();
}
int main(){
freopen("lca.in", "r", stdin);
freopen("lca.out", "w", stdout);
scanf("%d %d", &N, &M);
for (int i = 2, x; i <= N; ++i)
scanf("%d", &x),
list[x].push_back(i);
DFS();
for (int x, y; M; --M, ans = (1 << 30)){
scanf("%d %d", &x, &y);
a = Beg[x], b = Beg[y];
if (a > b) a ^= b ^= a ^= b;
query();
printf("%d\n", ans);
}
return 0;
}