#include <iostream>
#include <vector>
#include <list>
#include <fstream>
#include <cmath>
using namespace std;
ifstream be("lca.in");
ofstream ki("lca.out");
void beolvas(vector<list<int>>& sz_lista, vector<int>& szulo, int n);
void bejar(const vector<list<int>>& sz_lista, int u, vector<int>& szint, int& h, vector<bool>& jart);
int LCA_sqrt(int x, int y, vector<int>& szulo, vector<int>& p, vector<int>& szint);
void LCA(const vector<list<int>>& sz_lista, vector<int>& szulo, int n, int m);
int main() {
int n, m;
be >> n >> m;
vector<int> szulo(n);
vector<list<int>> sz_lista(n+1);
beolvas(sz_lista, szulo, n);
LCA(sz_lista, szulo, n, m);
}
void beolvas(vector<list<int>>& sz_lista, vector<int>& szulo, int n) {
for (int i = 1; i < n; i++) {
int x;
be >> x;
x--;
szulo[i] = x;
sz_lista[x].push_back(i);
sz_lista[i].push_back(x);
}
}
void bejar(const vector<list<int>>& sz_lista, int u, vector<int>& szint, int& h, vector<bool>& jart){
jart[u] = true;
for (int i : sz_lista[u]) {
if (!jart[i]) {
szint[i] = szint[u] + 1;
if (szint[i] > h)h = szint[i];
bejar(sz_lista, i, szint, h, jart);
}
}
}
int LCA_sqrt(int x, int y, vector<int>& szulo, vector<int>& p, vector<int>& szint){
while (p[x] != p[y]){
if (szint[x] > szint[y])
x = p[x];
else
y = p[y];
}
while (x != y){
if (szint[x] > szint[y])
x = szulo[x];
else
y = szulo[y];
}
return x;
}
void LCA(const vector<list<int>>& sz_lista, vector<int>& szulo, int n, int m) {
vector<int> szint(n, 0);
vector<bool> jart(n, false);
int h = 0;
bejar(sz_lista, 0, szint, h, jart);
vector<int> p(n);
int k = sqrt(h);
for (int i = 0; i < n; i++){
if (szint[i] <= k) p[i] = 0;
else if (szint[i] % k == 1) p[i] = szulo[i];
else p[i] = p[szulo[i]];
}
for (int i = 0; i < m; i++){
int x, y;
be >> x >> y;
x--, y--;
ki << LCA_sqrt(x, y, szulo, p, szint) + 1 << "\n";
}
}