#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int s = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9')
    s = (s << 3) + (s << 1) + ch - '0', ch = getchar();
  return s * f;
}
const int N = 1e5 + 5, M = 320;
int n, m, fa[N], top[N], t[N], sz[N], son[N];
struct Edge {
  int to, next;
} e[N];
int head[N], ecnt, id[N], pos[N], L[M], R[M];
inline void adde(int u, int v) {
  e[++ecnt].next = head[u];
  e[ecnt].to = v;
  head[u] = ecnt;
}
void dfs1(int u) {
  sz[u] = 1;
  for (int i = head[u], v; i; i = e[i].next) {
    v = e[i].to;
    dfs1(v);
    sz[u] += sz[v];
    if (sz[son[u]] < sz[v]) son[u] = v;
  }
}
int inde, p[N], cnt[M][N], ans, tag[M], blk, blksz;
void dfs2(int u, int fr) {
  id[u] = ++inde;
  p[inde] = u;
  top[u] = fr;
  ++cnt[pos[inde]][t[u]];
  if (son[u]) dfs2(son[u], fr);
  for (int i = head[u], v; i; i = e[i].next) {
    v = e[i].to;
    if (v != son[u]) dfs2(v, v);
  }
}
bool black[N];
inline void modify_blk(int x, int l, int r, int val) {
  if (l <= L[x] && R[x] <= r) {
    if (val > 0) {
      ++tag[x];
      ans += cnt[x][tag[x]];
    } else {
      ans -= cnt[x][tag[x]];
      --tag[x];
    }
  } else {
    for (int i = max(l, L[x]), u; i <= min(r, R[x]); ++i) {
      u = p[i];
      if (black[u]) {
        if (val > 0)
          --t[u];
        else
          ++t[u];
        continue;
      }
      if (val > 0) {
        --cnt[x][t[u]];
        ++cnt[x][--t[u]];
        if (t[u] == tag[x]) ++ans;
      } else {
        --cnt[x][t[u]];
        if (t[u] == tag[x]) --ans;
        ++cnt[x][++t[u]];
      }
    }
  }
}
inline void modify_node(int u, int val) {
  if (black[u] && !val) {
    ++cnt[pos[id[u]]][t[u]];
    if (t[u] <= tag[pos[id[u]]]) ++ans;
  } else if (!black[u] && val) {
    --cnt[pos[id[u]]][t[u]];
    if (t[u] <= tag[pos[id[u]]]) --ans;
  }
  black[u] = val;
}
inline void modify(int x, int val) {
  if (black[x] == val) return;
  modify_node(x, val);
  int u = fa[x], l, r;
  while (u) {
    l = id[top[u]];
    r = id[u];
    if (pos[l] == pos[r]) {
      modify_blk(pos[l], l, r, black[x]);
    } else {
      modify_blk(pos[l], l, r, black[x]);
      modify_blk(pos[r], l, r, black[x]);
      for (int i = pos[l] + 1; i < pos[r]; ++i) modify_blk(i, l, r, black[x]);
    }
    u = fa[top[u]];
  }
}
int main() {
  n = read();
  m = read();
  for (int i = 2; i <= n; ++i) fa[i] = read(), adde(fa[i], i);
  for (int i = 1; i <= n; ++i) t[i] = read() + 1;
  blksz = min(N / (M - 2), int(sqrt(n)));
  blk = (n - 1) / blksz + 1;
  for (int i = 1; i <= n; ++i) pos[i] = (i - 1) / blksz + 1;
  for (int i = 1; i <= blk; ++i) L[i] = (i - 1) * blksz + 1, R[i] = i * blksz;
  R[blk] = n;
  dfs1(1);
  dfs2(1, 0);
  while (m--) {
    int node = read(), val = 1;
    if (node < 0) node = -node, val = 0;
    modify(node, val);
    printf("%d ", ans);
  }
  return 0;
}
