#include <bits/stdc++.h>
using namespace std;
int n, m, fa[1 << 18], dep[1 << 18], a[1 << 18], ls[1 << 18], ans[1 << 18];
int siz[1 << 18], pos[1 << 18], t, vis[1 << 18], up[1 << 18], id[1 << 18];
vector<int> v[1 << 18];
struct qr {
  int x, t, id;
} q[1 << 18];
struct segTree {
  struct node {
    int t, v, mx;
  } a[1 << 21];
  void pushdown(int p) {
    if (a[p].t)
      a[p].t = 0, a[(p << 1)].t = a[(p << 1 | 1)].t = 1,
      a[(p << 1)].v = a[(p << 1 | 1)].v = a[p].v;
  }
  void update(int p, int l, int r) {
    if (a[p].t)
      a[p].mx = a[p].v + r * 2;
    else
      a[p].mx = max(a[(p << 1)].mx, a[(p << 1 | 1)].mx);
  }
  void ins(int l, int r, int b, int p = 1, int tl = 1, int tr = n + 1) {
    if (l <= tl && tr <= r) {
      a[p].t = 1, a[p].v = b;
      update(p, tl, tr);
      return;
    }
    int mid = tl + tr >> 1;
    pushdown(p);
    if (l <= mid)
      ins(l, r, b, (p << 1), tl, mid);
    else
      update((p << 1), tl, mid);
    if (r > mid)
      ins(l, r, b, (p << 1 | 1), mid + 1, tr);
    else
      update((p << 1 | 1), mid + 1, tr);
    update(p, tl, tr);
  }
  int qry(int l, int r, int v, int p = 1, int tl = 1, int tr = n + 1) {
    if (tl == tr) return a[p].mx > v ? tl : tl - 1;
    int mid = tl + tr >> 1;
    pushdown(p);
    update((p << 1), tl, mid);
    update((p << 1 | 1), mid + 1, tr);
    if (l <= tl && tr <= r) {
      return a[(p << 1 | 1)].mx > v ? qry(l, r, v, (p << 1 | 1), mid + 1, tr)
                                    : qry(l, r, v, (p << 1), tl, mid);
    }
    if (r <= mid) return qry(l, r, v, (p << 1), tl, mid);
    if (l > mid) return qry(l, r, v, (p << 1 | 1), mid + 1, tr);
    int x = qry(l, r, v, (p << 1 | 1), mid + 1, tr);
    return x == mid ? qry(l, r, v, (p << 1), tl, mid) : x;
  }
} tr;
void dfs(int p, int u) {
  vis[p] = 1;
  up[p] = u;
  pos[p] = ++t;
  id[t] = p;
  if (siz[p] == 1) return;
  int mx = -1, mp;
  for (int i : v[p])
    if (siz[i] > mx && !vis[i]) mx = siz[i], mp = i;
  dfs(mp, u);
  for (int i : v[p])
    if (!vis[i]) dfs(i, i);
}
int qry(int p, int v) {
  for (; p; p = fa[up[p]]) {
    int t = tr.qry(pos[up[p]], pos[p], v);
    if (t >= pos[up[p]]) return id[t];
  }
  return 0;
}
int main() {
  scanf("%d%d", &n, &m);
  siz[0] = 1;
  for (int i = 1; i <= n; i++)
    scanf("%d", fa + i), dep[i] = dep[fa[i]] + 1, siz[i] = 1;
  for (int i = n; i; i--) siz[fa[i]] += siz[i], v[fa[i]].push_back(i);
  dfs(0, 0);
  for (int i = 1; i <= m; i++) scanf("%d%d", &q[i].x, &q[i].t), q[i].id = i;
  sort(q + 1, q + 1 + m, [](qr a, qr b) {
    return dep[a.x] + a.t < dep[b.x] + b.t ||
           dep[a.x] + a.t == dep[b.x] + b.t && a.x < b.x;
  });
  for (int i = 1; i <= m; ++i) {
    int u = qry(q[i].x, q[i].t + dep[q[i].x]), t;
    ans[q[i].id] = (dep[q[i].x] - dep[u]) * 2 + q[i].t;
    for (t = q[i].x; dep[up[t]] > dep[u]; t = fa[up[t]])
      tr.ins(pos[up[t]], pos[t],
             q[i].t - dep[u] * 2 + 2 * (dep[t] - pos[t]) + dep[q[i].x]);
    if (t != u)
      tr.ins(pos[u] + 1, pos[t],
             q[i].t - dep[u] * 2 + 2 * (dep[t] - pos[t]) + dep[q[i].x]);
  }
  for (int i = 1; i <= m; ++i) printf("%d%c", ans[i], " \n"[i == m]);
  return 0;
}
