#include <bits/stdc++.h>
long long mod = 1e9 + 7;
const int N = 1e5;
std::vector<int> g[N];
int tin[N], tout[N], tin2[N], timer = 0, timer2 = 0, LCA[N][30], h[N];
int rev[N];
void dfs(int v, int p = 0, int h1 = 0) {
  h[v] = h1;
  rev[timer] = v;
  tin[v] = timer++;
  tin2[v] = timer2++;
  timer2++;
  LCA[v][0] = p;
  for (int i = 1; i < 30; ++i) {
    LCA[v][i] = LCA[LCA[v][i - 1]][i - 1];
  }
  for (auto e : g[v]) {
    if (e == p) {
      continue;
    }
    dfs(e, v, h1 + 1);
  }
  tout[v] = timer2++;
}
bool is_upper(int a, int b) { return tin2[a] <= tin2[b] && tout[a] >= tout[b]; }
int lca(int a, int b) {
  if (is_upper(a, b)) {
    return a;
  }
  if (is_upper(b, a)) {
    return a;
  }
  for (int i = 29; i >= 0; --i) {
    if (!is_upper(LCA[a][i], b)) {
      a = LCA[a][i];
    }
  }
  return LCA[a][0];
}
struct ver {
  int min = 1e9, max = -1e9;
  ver() {}
  ver(int a) {
    min = a;
    max = a;
  }
  ver(int a, int b) {
    min = a;
    max = b;
  }
  friend ver operator+(ver a, ver b) {
    return ver(std::min(a.min, b.min), std::max(a.max, b.max));
  }
};
struct seg_tree {
  ver tree[4 * N];
  void upd(int v, int tl, int tr, int i, int x) {
    if (tl == tr) {
      tree[v] = ver(x);
      return;
    }
    int tm = (tl + tr) / 2;
    if (tm >= i) {
      upd(v * 2, tl, tm, i, x);
    } else {
      upd(v * 2 + 1, tm + 1, tr, i, x);
    }
    tree[v] = tree[v * 2] + tree[v * 2 + 1];
  }
  ver get(int v, int tl, int tr, int l, int r) {
    if (l > r) {
      return ver();
    }
    if (tl == l && tr == r) {
      return tree[v];
    }
    int tm = (tl + tr) / 2;
    ver get1 = get(v * 2, tl, tm, l, std::min(r, tm));
    ver get2 = get(v * 2 + 1, tm + 1, tr, std::max(l, tm + 1), r);
    return get1 + get2;
  }
};
int getAnsw(int a, int b) { return h[lca(a, b)]; }
int main() {
  int n, m;
  std::cin >> n >> m;
  for (long long i = 0; i < n - 1; ++i) {
    int p;
    std::cin >> p;
    --p;
    g[i + 1].push_back(p);
    g[p].push_back(i + 1);
  }
  dfs(0);
  seg_tree cur;
  for (long long i = 0; i < n; ++i) {
    cur.upd(1, 0, n - 1, i, tin[i]);
  }
  for (long long i = 0; i < m; ++i) {
    int l, r;
    std::cin >> l >> r;
    --l;
    --r;
    ver a1 = cur.get(1, 0, n - 1, l, r);
    ver a2 = cur.get(1, 0, n - 1, l, rev[a1.min] - 1) +
             cur.get(1, 0, n - 1, rev[a1.min] + 1, r);
    ver a3 = cur.get(1, 0, n - 1, l, rev[a1.max] - 1) +
             cur.get(1, 0, n - 1, rev[a1.max] + 1, r);
    int answ1 = getAnsw(rev[a2.min], rev[a2.max]);
    int answ2 = getAnsw(rev[a3.min], rev[a3.max]);
    if (answ1 > answ2) {
      std::cout << rev[a1.min] + 1 << ' ' << answ1;
    } else {
      std::cout << rev[a1.max] + 1 << ' ' << answ2;
    }
    std::cout << '\n';
  }
}
