#include <bits/stdc++.h>
const int maxn = 100010, maxb = 80, maxk = 1280, T = 500;
int n, m, t[maxn];
struct edge {
  int to;
  edge* next;
} E[maxn * 2], *ne = E, *fir[maxn];
void link(int u, int v) {
  *ne = (edge){v, fir[u]};
  fir[u] = ne++;
}
int fa[maxn], dep[maxn], siz[maxn], son[maxn], top[maxn];
void init(int i) {
  siz[i] = 1;
  for (edge* e = fir[i]; e; e = e->next) {
    fa[e->to] = i;
    dep[e->to] = dep[i] + 1;
    init(e->to);
    if (siz[e->to] > siz[son[i]]) son[i] = e->to;
    siz[i] += siz[e->to];
  }
}
int pre[maxn], pos[maxn], list[maxn], now;
void hld(int i) {
  list[pre[i] = now++] = i;
  if (son[i]) top[son[i]] = top[i], hld(son[i]);
  for (edge* e = fir[i]; e; e = e->next)
    if (e->to != son[i]) top[e->to] = e->to, hld(e->to);
  pos[i] = now;
}
int BIT[maxn];
void B_add(int i, int x) {
  for (i++; i <= n; i += i & -i) BIT[i] += x;
}
int B_sum(int i) {
  int s = 0;
  for (; i; i -= i & -i) s += BIT[i];
  return s;
}
int blo, x[maxn], cnt[maxk][T * 2 + 10], add[maxk], ans;
bool leave[maxn];
void x_add(int b, int i, int v) {
  if (x[i] >= -T && x[i] <= T) cnt[b][x[i] + T]--;
  x[i] += v;
  if (x[i] >= -T && x[i] <= T) cnt[b][x[i] + T]++;
}
void reb(int b) {
  int bl = b * blo, br = bl + blo;
  if (br > n) br = n;
  for (int i = bl; i < br; i++)
    if (!leave[i]) x_add(b, i, add[b]);
  add[b] = 0;
}
void deal(int b, int l, int r, bool ty) {
  for (int i = r; i-- > l;)
    if (!leave[i]) {
      x_add(b, i, ty ? 1 : -1);
      if (ty == 1)
        x[i] + add[b] == 0 ? ans-- : 1;
      else
        x[i] + add[b] == -1 ? ans++ : 1;
    }
}
void deal_c(int x, bool ty) {
  for (; x; x = fa[top[x]]) {
    int l = pre[top[x]], r = pre[x] + 1, bl = (l + blo - 1) / blo, br = r / blo;
    if (bl <= br) {
      deal(br, br * blo, r, ty);
      for (int i = br; i-- > bl;) {
        if (add[i] == (ty ? T : -T)) reb(i);
        if (ty)
          ans -= cnt[i][T - add[i] - 1], add[i]++;
        else
          ans += cnt[i][T - add[i]], add[i]--;
      }
      deal(bl - 1, l, bl * blo, ty);
    } else
      deal(br, l, r, ty);
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 2, p; i <= n; i++) scanf("%d", &p), link(p, i);
  for (int i = 1; i <= n; i++) scanf("%d", t + i);
  init(1);
  top[1] = 1;
  hld(1);
  blo = sqrt(n);
  if (!blo) blo = 1;
  for (int i = 0; i < n; i++) {
    x[i] = t[list[i]];
    if (x[i] >= -T && x[i] <= T) cnt[i / blo][x[i] + T]++;
  }
  while (m--) {
    int q;
    scanf("%d", &q);
    if (q > 0) {
      B_add(pre[q], 1);
      int i = pre[q], s = x[i] + add[i / blo];
      if (s < 0) ans--;
      leave[i] = 1;
      if (x[i] >= -T && x[i] <= T) cnt[i / blo][x[i] + T]--;
      deal_c(fa[q], 0);
    } else {
      q = -q;
      B_add(pre[q], -1);
      int i = pre[q], s = t[q] - B_sum(pos[q]) + B_sum(pre[q]);
      if (s < 0) ans++;
      x[i] = s - add[i / blo];
      leave[i] = 0;
      if (x[i] >= -T && x[i] <= T) cnt[i / blo][x[i] + T]++;
      deal_c(fa[q], 1);
    }
    printf("%d%c", ans, " \n"[!m]);
  }
}
