#include <bits/stdc++.h>
using namespace std;
int read() {
  int nm = 0;
  char c = getchar();
  for (; !isdigit(c); c = getchar())
    ;
  for (; isdigit(c); c = getchar()) nm = nm * 10 + c - '0';
  return nm;
}
int n, m, tote, dft, ans, t[100010], q[100010], r[100010], deep[100010],
    top[100010], son[100010], sz[100010], u[100010], st[100010], id[100010],
    key[100010], dfn[100010], fa[100010];
const int biao = 600;
vector<int> to[100010], buc[100010 << 1];
bool b[100010];
void dfs(int now, int f) {
  deep[now] = deep[f] + 1;
  sz[now] = 1;
  for (int i = 0; i < to[now].size(); i++) {
    int vj = to[now][i];
    dfs(vj, now);
    if (sz[son[now]] < sz[vj]) son[now] = vj;
    sz[now] += sz[vj];
  }
}
void dfs(int now) {
  dfn[now] = ++dft;
  if (son[now]) {
    top[son[now]] = top[now];
    dfs(son[now]);
  }
  for (int i = 0; i < to[now].size(); i++) {
    int vj = to[now][i];
    if (vj == son[now]) continue;
    top[vj] = vj;
    dfs(vj);
  }
}
int lca(int a, int b) {
  while (top[a] != top[b]) {
    if (deep[top[a]] < deep[top[b]]) swap(a, b);
    a = fa[top[a]];
  }
  if (deep[a] > deep[b]) swap(a, b);
  return a;
}
bool cmp(int a, int b) { return dfn[a] < dfn[b]; }
int rec(int now) {
  int a = b[now];
  for (int i = 0; i < to[now].size(); i++) {
    int vj = to[now][i];
    a += rec(vj);
  }
  r[now] = t[now] - a;
  return a;
}
struct Note {
  int hd, pnt, sum, dx;
  vector<pair<int, int> > s;
  void clear() {
    hd = pnt = sum = dx = 0;
    vector<pair<int, int> >().swap(s);
  }
} g[100010];
void work(int L, int R) {
  rec(1);
  for (int i = L; i <= R; i++) u[i - L] = q[i];
  sort(u, u + R - L + 1, cmp);
  int tp = 1, num = 1;
  st[1] = key[1] = 1;
  for (int i = 0; i <= R - L; i++) {
    int A = lca(u[i], st[tp]);
    while (deep[A] < deep[st[tp]]) {
      if (deep[st[tp - 1]] <= deep[A]) {
        g[st[tp--]].hd = A;
        if (st[tp] != A) st[++tp] = A, key[++num] = A;
        break;
      }
      g[st[tp]].hd = st[tp - 1];
      tp--;
    }
    if (st[tp] != u[i]) st[++tp] = u[i], key[++num] = u[i];
  }
  for (; tp > 1; tp--) g[st[tp]].hd = st[tp - 1];
  memset(id, 0, sizeof(id));
  for (int i = 1; i <= num; i++) {
    for (int p = fa[key[i]]; p != g[key[i]].hd; p = fa[p]) {
      id[p] = key[i];
    }
  }
  for (int i = 0; i <= (n << 1); i++) vector<int>().swap(buc[i]);
  for (int i = 1; i <= n; i++)
    if (!b[i]) buc[r[i] + n].push_back(i);
  for (int i = 0; i <= (n << 1); i++) {
    for (int j = 0; j < buc[i].size(); j++) {
      if (id[buc[i][j]]) {
        int o = id[buc[i][j]], ss = g[o].s.size();
        if (ss && g[o].s[ss - 1].first == i - n)
          g[o].s[ss - 1].second++;
        else
          g[o].s.push_back(make_pair(i - n, 1));
      }
    }
  }
  for (int i = 1; i <= num; i++)
    for (int k = key[i]; g[k].pnt < g[k].s.size() && g[k].s[g[k].pnt].first < 0;
         g[k].pnt++)
      ;
  for (int i = L; i <= R; i++) {
    b[q[i]] ^= 1;
    if (b[q[i]]) {
      if (r[q[i]] < 0) ans--;
      r[q[i]]--;
      for (int p = q[i]; g[p].hd;) {
        g[p].dx--;
        if (g[p].pnt < g[p].s.size() && g[p].s[g[p].pnt].first + g[p].dx < 0)
          ans += g[p].s[g[p].pnt].second, g[p].pnt++;
        p = g[p].hd, r[p]--;
        if (b[p] == 0 && r[p] == -1) ans++;
      }
    } else {
      r[q[i]]++;
      if (r[q[i]] < 0) ans++;
      for (int p = q[i]; g[p].hd;) {
        g[p].dx++;
        if (g[p].pnt && g[p].s[g[p].pnt - 1].first + g[p].dx >= 0)
          g[p].pnt--, ans -= g[p].s[g[p].pnt].second;
        p = g[p].hd, r[p]++;
        if (b[p] == 0 && r[p] == 0) ans--;
      }
    }
    cout << ans << ' ';
  }
  for (int i = 1; i <= num; i++) g[key[i]].clear();
}
int main() {
  n = read(), m = read();
  for (int i = 2; i <= n; i++) fa[i] = read(), to[fa[i]].push_back(i);
  dfs(1, 0);
  top[1] = 1;
  dfs(1);
  for (int i = 1; i <= n; i++) t[i] = read();
  for (int i = 1; i <= m; i++) q[i] = read();
  for (int i = 1; i <= m; i += biao) work(i, min(i + biao - 1, m));
  return 0;
}
