# include <bits/stdc++.h>
# define maxn 100005
# define ll long long
# define clock (clock() * 1000.0 / CLOCKS_PER_SEC)
# define rc(s) return cout << s,0
# define _ ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0);
# define pb push_back
# define mp make_pair
# define int ll
using namespace std;
inline int readChar();
template <class T = int> inline T readInt();
template <class T> inline void writeInt( T x, char end = 0 );
inline void writeChar( int x );
inline void writeWord( const char *s );
/** Read */
static const int buf_size = 4096;
inline int getChar() {
static char buf[buf_size];
static int len = 0, pos = 0;
if (pos == len)
pos = 0, len = fread(buf, 1, buf_size, stdin);
if (pos == len)
return -1;
return buf[pos++];
}
inline int readChar() {
int c = getChar();
while (c <= 32)
c = getChar();
return c;
}
template <class T>
inline T readInt() {
int s = 1, c = readChar();
T x = 0;
if (c == '-')
s = -1, c = getChar();
while ('0' <= c && c <= '9')
x = x * 10 + c - '0', c = getChar();
return s == 1 ? x : -x;
}
inline ll readLong() {
int s = 1, c = readChar();
ll x = 0;
if (c == '-')
s = -1, c = getChar();
while ('0' <= c && c <= '9')
x = x * 10 + c - '0', c = getChar();
return s == 1 ? x : -x;
}
/** Write */
static int write_pos = 0;
static char write_buf[buf_size];
inline void writeChar( int x ) {
if (write_pos == buf_size)
fwrite(write_buf, 1, buf_size, stdout), write_pos = 0;
write_buf[write_pos++] = x;
}
template <class T>
inline void writeInt( T x, char end ) {
if (x < 0)
writeChar('-'), x = -x;
char s[24];
int n = 0;
while (x || !n)
s[n++] = '0' + x % 10, x /= 10;
while (n--)
writeChar(s[n]);
if (end)
writeChar(end);
}
inline void writeWord( const char *s ) {
while (*s)
writeChar(*s++);
}
struct Flusher {
~Flusher() {
if (write_pos)
fwrite(write_buf, 1, write_pos, stdout), write_pos = 0;
}
} flusher;
int tin[maxn],tout[maxn];
int up[maxn][20];
int mxl;
int timer;
vector<int>vec[maxn];
int x,y,n,m;
void dfs(int nod,int p)
{
tin[nod] = ++ timer;
up[nod][0] = p;
for(int i = 1;i<=mxl;i++)
up[nod][i] = up[up[nod][i - 1]][i - 1];
for(auto it : vec[nod])
dfs(it,nod);
tout[nod] = ++ timer;
}
bool upper(int a,int b)
{
return (tin[a] <= tin[b] && tout[a] >= tout[b]);
}
int lca(int a,int b)
{
if(upper(a,b)) return a;
if(upper(b,a)) return b;
for(int i = mxl;i >= 0;i --)
{
if(!upper(up[a][i],b))
a = up[a][i];
}
return up[a][0];
}
int32_t main(){_
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
n = readInt();
mxl = trunc(log2(n));
m = readInt();
for(int i = 2;i<=n;i++)
{
x = readInt();
vec[x].pb(i);
memset(up[i],1,sizeof(up[i]));
}
memset(up[1],1,sizeof(up[1]));
dfs(1,1);
while(m--)
{
x = readInt();
y = readInt();
writeInt(lca(x,y),'\n');
}
}