#include <bits/stdc++.h>
using namespace std;
int gi() {
  int x = 0, w = 1;
  char ch = getchar();
  while ((ch < '0' || ch > '9') && ch != '0') ch = getchar();
  if (ch == '-') w = 0, ch = getchar();
  while (ch >= '0' && ch <= '9')
    x = (x << 3) + (x << 1) + ch - '0', ch = getchar();
  return w ? x : -x;
}
const int N = 2e5 + 5;
const int inf = 1e9;
int n, m, nxt[N], head[N], fa[N], dep[N], sz[N], son[N], top[N], dfn[N], tim,
    id[N], D[N << 2], mx[N << 2], tag[N << 2], ans[N];
struct node {
  int u, t, id;
  bool operator<(const node &b) const {
    return dep[u] + t == dep[b.u] + b.t ? u < b.u : dep[u] + t < dep[b.u] + b.t;
  }
} q[N];
void dfs1(int u, int f) {
  fa[u] = f;
  dep[u] = dep[f] + 1;
  sz[u] = 1;
  for (int v = head[u]; v; v = nxt[v]) {
    dfs1(v, u);
    sz[u] += sz[v];
    if (sz[v] > sz[son[u]]) son[u] = v;
  }
}
void dfs2(int u, int up) {
  top[u] = up;
  id[dfn[u] = ++tim] = u;
  if (son[u]) dfs2(son[u], up);
  for (int v = head[u]; v; v = nxt[v])
    if (v != son[u]) dfs2(v, v);
}
void build(int x, int l, int r) {
  mx[x] = tag[x] = -inf;
  if (l == r) {
    D[x] = dep[id[l]] << 1;
    return;
  }
  int mid = l + r >> 1;
  build(x << 1, l, mid);
  build(x << 1 | 1, mid + 1, r);
  D[x] = max(D[x << 1], D[x << 1 | 1]);
}
void cover(int x, int v) {
  mx[x] = max(mx[x], v + D[x]);
  tag[x] = max(tag[x], v);
}
void pushdown(int x) {
  if (tag[x] == -inf) return;
  cover(x << 1, tag[x]);
  cover(x << 1 | 1, tag[x]);
  tag[x] = -inf;
}
void modify(int x, int l, int r, int ql, int qr, int v) {
  if (l >= ql && r <= qr) {
    cover(x, v);
    return;
  }
  pushdown(x);
  int mid = l + r >> 1;
  if (ql <= mid) modify(x << 1, l, mid, ql, qr, v);
  if (qr > mid) modify(x << 1 | 1, mid + 1, r, ql, qr, v);
  mx[x] = max(mx[x << 1], mx[x << 1 | 1]);
}
int query(int x, int l, int r, int ql, int qr) {
  if (l >= ql && r <= qr) return mx[x];
  pushdown(x);
  int mid = l + r >> 1, s = -inf;
  if (ql <= mid) s = max(s, query(x << 1, l, mid, ql, qr));
  if (qr > mid) s = max(s, query(x << 1 | 1, mid + 1, r, ql, qr));
  return s;
}
int main() {
  n = gi() + 1;
  m = gi();
  for (int i = 2, f; i <= n; ++i) nxt[i] = head[f = gi() + 1], head[f] = i;
  dfs1(1, 0);
  dfs2(1, 1);
  build(1, 1, n);
  for (int i = 1; i <= m; ++i) q[i] = (node){gi() + 1, gi(), i};
  sort(q + 1, q + m + 1);
  for (int i = 1; i <= m; ++i) {
    int u = q[i].u, res = 1;
    while (u) {
      if (query(1, 1, n, dfn[top[u]], dfn[u]) <= dep[q[i].u] + q[i].t) {
        u = fa[top[u]];
        continue;
      }
      int l = dfn[top[u]], r = dfn[u];
      while (l <= r) {
        int mid = l + r >> 1;
        if (query(1, 1, n, mid, dfn[u]) > dep[q[i].u] + q[i].t)
          res = id[mid], l = mid + 1;
        else
          r = mid - 1;
      }
      break;
    }
    ans[q[i].id] = q[i].t + (dep[q[i].u] - dep[res] << 1);
    u = q[i].u;
    while (u)
      modify(1, 1, n, dfn[top[u]], dfn[u], ans[q[i].id] - dep[q[i].u]),
          u = fa[top[u]];
  }
  for (int i = 1; i <= m; ++i) printf("%d ", ans[i]);
  return puts(""), 0;
}
