#include <bits/stdc++.h>
inline int read() {
  char c = getchar();
  int x = 0, ft = 1;
  for (; c < '0' || c > '9'; c = getchar())
    if (c == '-') ft = -1;
  for (; c >= '0' && c <= '9'; c = getchar()) x = x * 10 + c - '0';
  return x * ft;
}
const int inf = 2e9;
const int N = 2e5 + 5;
int n, m, h[N], edge_cnt, a[N], t[N], id[N], ans[N];
struct Edge {
  int to, nex;
} e[N << 1];
inline void add_edge(int u, int v) {
  e[++edge_cnt] = (Edge){v, h[u]};
  h[u] = edge_cnt;
}
int d[N], fa[N], sz[N], son[N], top[N], dfn[N], dfc, rk[N];
void dfs1(int u, int pre) {
  d[u] = d[pre] + 1;
  fa[u] = pre;
  sz[u] = 1;
  for (int i = h[u]; i; i = e[i].nex) {
    int v = e[i].to;
    dfs1(v, u);
    sz[u] += sz[v];
    if (!son[u] || sz[v] > sz[son[u]]) son[u] = v;
  }
}
void dfs2(int u, int pre) {
  top[u] = pre;
  dfn[u] = ++dfc;
  rk[dfc] = u;
  if (son[u]) dfs2(son[u], pre);
  for (int i = h[u]; i; i = e[i].nex) {
    int v = e[i].to;
    if (v != son[u]) dfs2(v, v);
  }
}
int mx[N << 2], tag[N << 2], pos;
inline void put_tag(int r, int c, int u) {
  mx[u] = 2 * r + c;
  tag[u] = c;
}
inline void push_down(int l, int r, int u) {
  if (tag[u] != -inf) {
    int mid = (l + r) >> 1;
    put_tag(mid, tag[u], (u << 1));
    put_tag(r, tag[u], (u << 1 | 1));
    tag[u] = -inf;
  }
}
void modify(int ql, int qr, int c, int l, int r, int u) {
  if (ql <= l && r <= qr)
    put_tag(r, c, u);
  else {
    int mid = (l + r) >> 1;
    push_down(l, r, u);
    if (ql <= mid) modify(ql, qr, c, l, mid, (u << 1));
    if (qr > mid) modify(ql, qr, c, mid + 1, r, (u << 1 | 1));
    mx[u] = std::max(mx[(u << 1)], mx[(u << 1 | 1)]);
  }
}
void query(int ql, int qr, int c, int l, int r, int u) {
  if (mx[u] <= c) return;
  if (l == r) {
    pos = rk[l];
    return;
  } else {
    int mid = (l + r) >> 1;
    push_down(l, r, u);
    if (pos == -1 && qr > mid) query(ql, qr, c, mid + 1, r, (u << 1 | 1));
    if (pos == -1 && ql <= mid) query(ql, qr, c, l, mid, (u << 1));
  }
}
int solve(int u, int t) {
  int v = u;
  for (; v; v = fa[top[v]]) {
    pos = -1;
    query(dfn[top[v]], dfn[v], t + dfn[v], 1, n, 1);
    if (pos > 0) {
      t += d[v] - d[pos];
      v = pos;
      break;
    }
    t += d[v] - d[fa[top[v]]];
  }
  if (!v) v = 1, --t;
  int res = t + d[u] - d[v];
  for (;; u = fa[top[u]]) {
    if (top[u] == top[v]) {
      if (u != v) {
        modify(dfn[v] + 1, dfn[u], t + d[u] - d[v] - dfn[u], 1, n, 1);
      }
      break;
    }
    modify(dfn[top[u]], dfn[u], t + d[u] - d[v] - dfn[u], 1, n, 1);
  }
  return res;
}
int main() {
  n = read() + 1;
  m = read();
  mx[1] = tag[1] = -inf + 1;
  for (int i = 2; i <= n; ++i) add_edge(read() + 1, i);
  dfs1(1, 0);
  dfs2(1, 1);
  for (int i = 1; i <= m; ++i) a[i] = read() + 1, t[i] = read(), id[i] = i;
  std::sort(id + 1, id + 1 + m, [&](int x, int y) {
    if (t[x] + d[a[x]] == t[y] + d[a[y]])
      return a[x] < a[y];
    else
      return t[x] + d[a[x]] < t[y] + d[a[y]];
  });
  for (int i = 1; i <= m; ++i) ans[id[i]] = solve(a[id[i]], t[id[i]]);
  for (int i = 1; i <= m; ++i) printf("%d ", ans[i]);
  return 0;
}
