#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, nn, q, h[N], in[N], lg2[N * 2], fir[N], p[N * 2][20], lcaLR[N][20],
    inmax[N][20], inmin[N][20], timer;
vector<int> adj[N];
void dfs(int u) {
  in[u] = ++timer;
  p[fir[u] = ++nn][0] = u;
  for (int v : adj[u]) {
    h[v] = h[u] + 1;
    dfs(v);
    p[++nn][0] = u;
  }
}
int getlca(int u, int v) {
  if (!u || !v) return u | v;
  static int l, r, k;
  l = fir[u];
  r = fir[v];
  if (l > r) swap(l, r);
  k = lg2[r - l + 1];
  u = p[l][k];
  v = p[r - (1 << k) + 1][k];
  return h[u] < h[v] ? u : v;
}
int getlcaLR(int l, int r) {
  if (l > r) return 0;
  static int k;
  k = lg2[r - l + 1];
  return getlca(lcaLR[l][k], lcaLR[r - (1 << k) + 1][k]);
}
int getmax(int l, int r) {
  static int u, v, k;
  k = lg2[r - l + 1];
  u = inmax[l][k];
  v = inmax[r - (1 << k) + 1][k];
  return in[u] > in[v] ? u : v;
}
int getmin(int l, int r) {
  static int u, v, k;
  k = lg2[r - l + 1];
  u = inmin[l][k];
  v = inmin[r - (1 << k) + 1][k];
  return in[u] < in[v] ? u : v;
}
void Rd(int &x) {
  static int c;
  for (c = getchar(); c < '0' || '9' < c; c = getchar())
    ;
  for (x = 0; '0' <= c && c <= '9'; c = getchar())
    x = (x << 1) + (x << 3) + c - '0';
}
void Wrt(int x) {
  if (x > 9) Wrt(x / 10);
  putchar(x % 10 + 48);
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  int u, v, l, r, au, av;
  Rd(n);
  Rd(q);
  for (int v = (2); v <= (n); ++v) {
    Rd(u);
    adj[u].push_back(v);
  }
  timer = lg2[1] = nn = 0;
  dfs(1);
  for (int i = (2); i <= (nn); ++i) lg2[i] = lg2[i / 2] + 1;
  for (int i = (1); i <= (n); ++i) lcaLR[i][0] = inmax[i][0] = inmin[i][0] = i;
  for (int j = (1); j <= (lg2[nn]); ++j)
    for (int i = (1); i <= (nn - (1 << j) + 1); ++i) {
      u = p[i][j - 1];
      v = p[i + (1 << (j - 1))][j - 1];
      p[i][j] = h[u] < h[v] ? u : v;
    }
  for (int j = (1); j <= (lg2[n]); ++j)
    for (int i = (1); i <= (n - (1 << j) + 1); ++i) {
      lcaLR[i][j] = getlca(lcaLR[i][j - 1], lcaLR[i + (1 << (j - 1))][j - 1]);
      u = inmax[i][j - 1];
      v = inmax[i + (1 << (j - 1))][j - 1];
      inmax[i][j] = in[u] > in[v] ? u : v;
      u = inmin[i][j - 1];
      v = inmin[i + (1 << (j - 1))][j - 1];
      inmin[i][j] = in[u] < in[v] ? u : v;
    }
  while (q--) {
    Rd(l);
    Rd(r);
    u = getmax(l, r);
    v = getmin(l, r);
    au = getlca(getlcaLR(l, u - 1), getlcaLR(u + 1, r));
    av = getlca(getlcaLR(l, v - 1), getlcaLR(v + 1, r));
    if (h[au] > h[av]) {
      Wrt(u);
      putchar(' ');
      Wrt(h[au]);
    } else {
      Wrt(v);
      putchar(' ');
      Wrt(h[av]);
    }
    putchar('\n');
  }
  return 0;
}
