#include <bits/stdc++.h>
using namespace std;
const int M = 500;
int v[100010];
int a[100010];
int ans;
struct Block {
  int cnt[200010];
  int zero;
  int l, r;
  void change(int x) {
    v[x] ^= 1;
    if (v[x]) cnt[a[x]]++;
    if (v[x] && a[x] < zero) ans++;
    if (!v[x]) cnt[a[x]]--;
    if (!v[x] && a[x] < zero) ans--;
    return;
  }
  void add(int x) {
    if (x == 1)
      ans -= cnt[--zero];
    else
      ans += cnt[zero++];
    return;
  }
  void add(int L, int R, int x) {
    if (L < l) L = l;
    if (r < R) R = r;
    for (int i = L; i <= R; i++) {
      if (v[i] && a[i] < zero) ans--;
      if (v[i]) cnt[a[i]]--;
      a[i] += x;
      if (v[i] && a[i] < zero) ans++;
      if (v[i]) cnt[a[i]]++;
    }
    return;
  }
} S[210];
int num[100010];
int dfn[100010], top[100010], now;
int son[100010], siz[100010], fa[100010];
struct Edge {
  int v, nxt;
} e[100010];
int tot;
int first[100010];
void build(int u, int v) {
  e[++tot] = (Edge){v, first[u]};
  first[u] = tot;
  return;
}
void dfs1(int u) {
  siz[u] = 1;
  for (int i = first[u]; i; i = e[i].nxt) {
    dfs1(e[i].v);
    siz[u] += siz[e[i].v];
    if (siz[e[i].v] > siz[son[u]]) son[u] = e[i].v;
  }
  return;
}
void dfs2(int u, int f) {
  top[u] = f;
  dfn[u] = ++now;
  if (son[u]) dfs2(son[u], f);
  for (int i = first[u]; i; i = e[i].nxt)
    if (!dfn[e[i].v]) dfs2(e[i].v, e[i].v);
  return;
}
int n, m;
void init() {
  scanf("%d %d", &n, &m);
  for (int i = 2; i <= n; i++) {
    scanf("%d", &fa[i]);
    build(fa[i], i);
  }
  dfs1(1);
  dfs2(1, 1);
  int N = 0;
  while (S[N].r < n) {
    N++;
    S[N].zero = n;
    S[N].l = S[N - 1].r + 1;
    S[N].r = min(S[N - 1].r + M, n);
    for (int i = S[N].l; i <= S[N].r; i++) num[i] = N;
  }
  for (int i = 1; i <= n; i++) scanf("%d", &a[dfn[i]]);
  for (int i = 1; i <= n; i++) {
    a[i] += n;
    v[i] = 1;
    S[num[i]].cnt[a[i]]++;
  }
  return;
}
void Add(int l, int r, int x) {
  int L = num[l];
  int R = num[r];
  if (L == R)
    S[L].add(l, r, x);
  else {
    S[L].add(l, r, x);
    S[R].add(l, r, x);
    for (int i = L + 1; i < R; i++) S[i].add(x);
  }
  return;
}
void Change(int u) {
  int x = dfn[u], o;
  S[num[x]].change(x);
  if (v[x])
    o = 1;
  else
    o = -1;
  while (u) {
    int v = top[u];
    Add(dfn[v], dfn[u], o);
    u = fa[v];
  }
  return;
}
int main() {
  init();
  for (int i = 1; i <= m; i++) {
    int u;
    scanf("%d", &u);
    if (u < 0) u = -u;
    Change(u);
    printf("%d ", ans);
  }
  printf("\n");
  return 0;
}
