#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline T rd() {
  T nmb = 0;
  int sgn = 0;
  char chr = getchar();
  while (!isdigit(chr)) {
    if (chr == '-') sgn = 1;
    chr = getchar();
  }
  while (isdigit(chr)) {
    nmb = (nmb << 3) + (nmb << 1) + chr - '0';
    chr = getchar();
  }
  return sgn ? -nmb : nmb;
}
template <typename T>
void wt(T nmb) {
  if (nmb > 9) wt(nmb / 10);
  putchar(nmb % 10 + '0');
}
template <typename T>
inline void cmax(T &x, T y) {
  x = x > y ? x : y;
}
template <typename T>
inline void cmin(T &x, T y) {
  x = x < y ? x : y;
}
inline void proc_status() {
  ifstream t("/proc/self/status");
  cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>())
       << endl;
}
const int N = 1e5 + 10, K = 40;
const int Len = 316;
vector<int> G[N];
int w[N];
int dfn[N], Cnt;
int dep[N], fa[N][K];
void Init(int x, int f) {
  dfn[x] = ++Cnt;
  dep[x] = dep[f] + 1;
  fa[x][0] = f;
  for (int i = 1; i <= 16; ++i) fa[x][i] = fa[fa[x][i - 1]][i - 1];
  for (int i = G[x].size() - 1; ~i; --i) {
    int k = G[x][i];
    Init(k, x);
  }
}
inline int lca(int x, int y) {
  if (dep[x] < dep[y]) swap(x, y);
  for (int i = 16; ~i; --i)
    if (dep[fa[x][i]] >= dep[y]) x = fa[x][i];
  if (x == y) return x;
  for (int i = 16; ~i; --i)
    if (fa[x][i] ^ fa[y][i]) x = fa[x][i], y = fa[y][i];
  return fa[x][0];
}
int p[N], q[N];
inline int cmp(int u, int v) { return dfn[u] < dfn[v]; }
int b[N];
vector<int> g[N];
int st[N], top;
void insert(int x) {
  if (top == 1) {
    st[++top] = x;
    return;
  }
  int t = lca(x, st[top]);
  if (t == st[top]) {
    st[++top] = x;
    return;
  }
  while (top > 1 && dfn[st[top - 1]] >= dfn[t]) {
    g[st[top - 1]].push_back(st[top]);
    --top;
  }
  if (st[top] ^ t) {
    g[t].push_back(st[top]);
    st[top] = t;
  }
  st[++top] = x;
}
int fw[N];
vector<int> vec[N];
int pos[N], cnt[N];
void init(int x, int f) {
  fw[x] = f;
  for (int t = fa[x][0]; t ^ f; t = fa[t][0])
    if (b[t]) vec[x].push_back(w[t]);
  sort(vec[x].begin(), vec[x].end());
  pos[x] = -1;
  for (int i = 0; i < vec[x].size(); ++i) {
    if (vec[x][i] >= 0) break;
    pos[x] = i;
  }
  for (int i = g[x].size() - 1; ~i; --i) {
    int k = g[x][i];
    init(k, x);
  }
}
void update(int x, int f) {
  fw[x] = 0;
  for (int t = fa[x][0]; t ^ f; t = fa[t][0]) w[t] -= cnt[x];
  cnt[x] = 0;
  for (int i = g[x].size() - 1; ~i; --i) {
    int k = g[x][i];
    update(k, x);
  }
  vector<int>().swap(g[x]);
  vector<int>().swap(vec[x]);
}
int main() {
  int n = rd<int>(), m = rd<int>();
  for (int i = 2; i <= n; ++i) {
    int f = rd<int>();
    G[f].push_back(i);
  }
  for (int i = 1; i <= n; ++i) w[i] = rd<int>();
  for (int i = 1; i <= m; ++i) q[i] = rd<int>();
  Init(1, 0);
  for (int i = 1; i <= n; ++i) b[i] = 1;
  int ans = 0;
  for (int l = 1; l <= m; l += Len) {
    int r = min(l + Len - 1, m);
    int len = r - l + 1;
    for (int i = l; i <= r; ++i) p[i - l + 1] = abs(q[i]);
    sort(p + 1, p + len + 1, cmp);
    len = unique(p + 1, p + len + 1) - p - 1;
    st[top = 1] = 1;
    for (int i = 1; i <= len; ++i) {
      if (p[i] == 1) continue;
      insert(p[i]);
    }
    while (top > 1) {
      g[st[top - 1]].push_back(st[top]);
      --top;
    }
    init(1, 0);
    for (int i = l; i <= r; ++i) {
      if (q[i] > 0) {
        if (!b[q[i]]) {
          printf("%d ", ans);
          continue;
        }
        if (w[q[i]] < 0) --ans;
        b[q[i]] = 0;
        for (int x = q[i]; x; x = fw[x]) {
          ++cnt[x];
          int nw = lower_bound(vec[x].begin(), vec[x].end(), cnt[x]) -
                   vec[x].begin() - 1;
          ans += nw - pos[x];
          pos[x] = nw;
          --w[x];
          if (b[x] && w[x] == -1) ++ans;
        }
      } else {
        if (b[-q[i]]) {
          printf("%d ", ans);
          continue;
        }
        if (w[-q[i]] < 0) ++ans;
        b[-q[i]] = 1;
        for (int x = -q[i]; x; x = fw[x]) {
          --cnt[x];
          int nw = lower_bound(vec[x].begin(), vec[x].end(), cnt[x]) -
                   vec[x].begin() - 1;
          ans -= pos[x] - nw;
          pos[x] = nw;
          ++w[x];
          if (b[x] && !w[x]) --ans;
        }
      }
      printf("%d ", ans);
    }
    update(1, 0);
  }
  return 0;
}
