#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
struct edge {
  int to, next;
} ed[N << 1];
int head[N], sz, qy[N], b[N], d[N], t[N], A[N], B[N], tim, st[N], cnt, fa[N],
    faa[N], f[N][18], deep[N], vis[N], tmp[N], ans = 0, pq[N], lev[N];
vector<pair<int, int> > c[N];
void add_edge(int from, int to) {
  ed[++sz].to = to;
  ed[sz].next = head[from];
  head[from] = sz;
}
int read() {
  int x = 0;
  char c = getchar(), flag = '+';
  while (!isdigit(c)) flag = c, c = getchar();
  while (isdigit(c)) x = x * 10 + c - '0', c = getchar();
  return flag == '-' ? -x : x;
}
bool cmp(int a, int b) { return A[a] < A[b]; }
int Lca(int x, int y) {
  if (deep[x] < deep[y]) swap(x, y);
  for (int j = 17; j >= 0; j--)
    if (deep[f[x][j]] >= deep[y]) x = f[x][j];
  if (x == y) return x;
  for (int j = 17; j >= 0; j--)
    if (f[x][j] ^ f[y][j]) x = f[x][j], y = f[y][j];
  return f[x][0];
}
void dfs0(int u, int ff) {
  A[u] = ++tim;
  fa[u] = ff;
  f[u][0] = ff;
  deep[u] = deep[ff] + 1;
  for (int i = head[u]; i; i = ed[i].next) {
    int v = ed[i].to;
    if (v == ff) continue;
    dfs0(v, u);
  }
  B[u] = ++tim;
}
int dfs1(int u, int ff) {
  int sum = d[u];
  for (int i = head[u]; i; i = ed[i].next) {
    int v = ed[i].to;
    if (v == ff) continue;
    sum += dfs1(v, u);
  }
  t[u] -= sum;
  return sum;
}
void solve() {
  int m = cnt, top = 0;
  cnt = 0;
  for (int i = 1; i <= m; i++) {
    int x = abs(qy[i]);
    if (!vis[x]) b[++cnt] = x, vis[x] = 1;
  }
  sort(b + 1, b + cnt + 1, cmp);
  for (int i = 1; i < cnt; i++) {
    int lca = Lca(b[i], b[i + 1]);
    if (!vis[lca]) vis[lca] = 2, b[++cnt] = lca;
  }
  sort(b + 1, b + cnt + 1, cmp);
  for (int i = 1; i <= cnt; i++) {
    while (top && (A[b[i]] < A[st[top]] || A[b[i]] > B[st[top]])) top--;
    faa[b[i]] = st[top];
    st[++top] = b[i];
  }
  for (int i = 1; i <= cnt; i++) {
    int u = b[i], x = fa[u], tot = 0;
    while (x ^ faa[u]) {
      if (!lev[x]) tmp[++tot] = t[x];
      x = fa[x];
    }
    sort(tmp + 1, tmp + tot + 1);
    c[u].clear();
    pq[u] = -1;
    for (int j = 1, p; j <= tot; j = p) {
      int num = 0;
      for (p = j; tmp[p] == tmp[j] && p <= tot; p++) num++;
      c[u].push_back(pair<int, int>(tmp[j], num));
      if (tmp[j] < 0) pq[u] = c[u].size() - 1;
    }
  }
  for (int i = 1; i <= m; i++) {
    int u = qy[i], k;
    if (u > 0) {
      k = 1;
      lev[u] = 1;
      if (t[u] < d[u]) ans--;
      d[u]++;
    } else {
      u = -u, k = -1;
      lev[u] = 0;
      d[u]--;
      if (t[u] < d[u]) ans++;
    }
    int x = u;
    while (x) {
      if (x != u) {
        if (!lev[x] && t[x] < d[x]) ans--;
        d[x] += k;
        if (!lev[x] && t[x] < d[x]) ans++;
      }
      if (pq[x] >= 0 && pq[x] < c[x].size() && d[x] <= c[x][pq[x]].first)
        ans -= c[x][pq[x]].second, pq[x]--;
      int tmp = c[x].size() - 1;
      if (pq[x] < tmp)
        if (d[x] > c[x][pq[x] + 1].first)
          ans += c[x][pq[x] + 1].second, pq[x]++;
      x = faa[x];
    }
    cout << ans << ' ';
  }
  for (int i = 1; i <= cnt; i++) d[b[i]] = 0;
  for (int i = 1; i <= m; i++) {
    if (qy[i] > 0)
      d[qy[i]]++;
    else
      d[-qy[i]]--;
  }
  dfs1(1, 0);
  for (int i = 1; i <= cnt; i++) {
    int x = b[i];
    d[x] = vis[x] = 0;
  }
}
int main() {
  int n = read(), m = read(), B = 1.2 * sqrt(n);
  for (int i = 2; i <= n; i++) {
    int x = read();
    add_edge(x, i), add_edge(i, x);
  }
  for (int i = 1; i <= n; i++) t[i] = read();
  dfs0(1, 0);
  for (int j = 1; j <= 17; j++)
    for (int i = 1; i <= n; i++) f[i][j] = f[f[i][j - 1]][j - 1];
  for (int i = 1; i <= m; i++) {
    qy[++cnt] = read();
    if (cnt == B || i == m) solve(), cnt = 0;
  }
  return 0;
}
