#include <bits/stdc++.h>
using namespace std;
const int inf = 2e9;
const long long Inf = 1e10;
const int P = 1e9 + 7;
const int N = 200005;
inline long long IN() {
  long long x = 0;
  int ch = 0, f = 0;
  for (ch = getchar(); ch != -1 && (ch < 48 || ch > 57); ch = getchar())
    f = (ch == '-');
  for (; ch >= 48 && ch <= 57; ch = getchar())
    x = (x << 1) + (x << 3) + ch - '0';
  return f ? (-x) : x;
}
template <typename T>
inline int chkmin(T &a, const T &b) {
  if (b < a) return a = b, 1;
  return 0;
}
template <typename T>
inline int chkmax(T &a, const T &b) {
  if (b > a) return a = b, 1;
  return 0;
}
void renew(int &x, const int &y) {
  x += y;
  if (x >= P) x -= P;
  if (x < 0) x += P;
}
int Pow(int x, int y, int p) {
  int a = 1;
  for (; y; y >>= 1, x = (long long)x * x % p)
    if (y & 1) a = (long long)a * x % p;
  return a;
}
int tim;
int fa[N];
int dfn[N];
int ind[N];
int top[N];
int n, m, dep[N];
int sz[N], hev[N];
int dex, adj[N];
struct edge {
  int v, pre;
} e[N];
void dfs(int x) {
  sz[x] = 1;
  for (int i = adj[x]; i; i = e[i].pre) {
    int v = e[i].v;
    fa[v] = x;
    dep[v] = dep[x] + 1;
    dfs(v);
    sz[x] += sz[v];
    if (sz[v] > sz[hev[x]]) hev[x] = v;
  }
}
void bud(int x) {
  dfn[x] = ++tim;
  ind[tim] = x;
  if (hev[x]) {
    top[hev[x]] = top[x];
    bud(hev[x]);
  }
  for (int i = adj[x]; i; i = e[i].pre) {
    int v = e[i].v;
    if (v == hev[x]) continue;
    top[v] = v;
    bud(v);
  }
}
int ans[N];
struct node {
  int v, x, y, id;
  int operator<(const node &a) const {
    if (v != a.v) return v < a.v;
    return x < a.x;
  }
} a[N];
int ql, qr, qx, qd;
int tag[N << 2], Mx[N << 2], Len[N << 2];
void Add(int x, int v) {
  tag[x] = v;
  Mx[x] = v + (Len[x] << 1) - 2;
}
void sep(int x) {
  if (tag[x] == -1) return;
  Add(x << 1, tag[x]);
  Add((x << 1) | 1, tag[x] + (Len[x << 1] << 1));
  tag[x] = -1;
}
int find_max(int x, int l, int r) {
  if (Mx[x] <= qx || ql > qr) return -1;
  if (l == r) return l;
  sep(x);
  int md = (l + r) >> 1;
  if (ql <= l && r <= qr) {
    int a = find_max((x << 1) | 1, md + 1, r);
    if (a != -1) return a;
    int b = find_max(x << 1, l, md);
    if (b != -1) return b;
    return -1;
  }
  if (md < qr) {
    int a = find_max((x << 1) | 1, md + 1, r);
    if (a != -1) return a;
  }
  if (ql <= md) {
    int b = find_max(x << 1, l, md);
    if (b != -1) return b;
  }
  return -1;
}
void B(int x, int l, int r) {
  Len[x] = r - l + 1;
  tag[x] = -1;
  if (l == r) return;
  int md = (l + r) >> 1;
  B(x << 1, l, md);
  B((x << 1) | 1, md + 1, r);
}
int Find(int x, int y) {
  for (int z = 0; x; x = fa[top[x]]) {
    int u = top[x];
    ql = dfn[u];
    if (u == 1) ql++;
    qr = dfn[x];
    qx = y;
    int gt = find_max(1, 1, n);
    if (gt != -1) {
      if (gt == dfn[x]) {
        return z;
      }
      return ind[gt + 1];
    }
    z = u;
    if (fa[top[x]] == 1) return top[x];
  }
  return hev[1];
}
void Cov(int x, int l, int r) {
  if (ql <= l && r <= qr) {
    Add(x, qd);
    qd += (Len[x] << 1);
    return;
  }
  sep(x);
  int md = (l + r) >> 1;
  if (ql <= md) Cov(x << 1, l, md);
  if (md < qr) Cov((x << 1) | 1, md + 1, r);
  Mx[x] = max(Mx[x << 1], Mx[(x << 1) | 1]);
}
void Make(int x, int p, int val) {
  for (; top[x] ^ top[p]; x = fa[top[x]]) {
    int u = dfn[top[x]], v = dfn[x];
    int z = top[x];
    ql = u;
    qr = v;
    qd = val + ((dep[z] - dep[p] + 1) << 1);
    if (ql <= qr) Cov(1, 1, n);
  }
  ql = dfn[p];
  qr = dfn[x];
  qd = val + 2;
  if (ql <= qr) Cov(1, 1, n);
}
int main() {
  scanf("%d%d", &n, &m);
  n++;
  for (int i = (int)(2); i <= (int)(n); i++) {
    int f;
    scanf("%d", &f);
    f++;
    e[++dex] = (edge){i, adj[f]};
    adj[f] = dex;
  }
  dfs(dep[1] = 1);
  bud(top[1] = 1);
  for (int i = (int)(1); i <= (int)(m); i++) {
    int t, x;
    scanf("%d%d", &x, &t);
    x++;
    a[i] = (node){dep[x] + t, x, t, i};
  }
  sort(a + 1, a + m + 1);
  B(1, 1, n);
  for (int i = (int)(1); i <= (int)(m); i++) {
    int p = Find(a[i].x, a[i].v);
    if (!p) {
      ans[a[i].id] = a[i].y;
      continue;
    }
    ans[a[i].id] = ((dep[a[i].x] - dep[p] + 1) << 1) + a[i].y;
    int x = a[i].x;
    Make(x, p, a[i].v);
  }
  for (int i = (int)(1); i <= (int)(m); i++) printf("%d ", ans[i]);
  puts("");
  return 0;
}
