#include <bits/stdc++.h>
using namespace std;
inline void read(int &x) {
  int v = 0, f = 1;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = (c & 15);
  while (isdigit(c = getchar())) v = (v << 1) + (v << 3) + (c & 15);
  x = v * f;
}
inline void read(long long &x) {
  long long v = 0ll, f = 1ll;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = (c & 15);
  while (isdigit(c = getchar())) v = (v << 1) + (v << 3) + (c & 15);
  x = v * f;
}
inline void readc(char &x) {
  char c;
  while (((c = getchar()) == ' ') || c == '\n')
    ;
  x = c;
}
inline void writes(string s) { puts(s.c_str()); }
inline void writeln() { writes(""); }
inline void writei(int x) {
  if (x < 0) {
    putchar('-');
    x = abs(x);
  }
  if (!x) putchar('0');
  char a[25];
  int top = 0;
  while (x) {
    a[++top] = (x % 10) + '0';
    x /= 10;
  }
  while (top) {
    putchar(a[top]);
    top--;
  }
}
inline void writell(long long x) {
  if (x < 0) {
    putchar('-');
    x = abs(x);
  }
  if (!x) putchar('0');
  char a[25];
  int top = 0;
  while (x) {
    a[++top] = (x % 10) + '0';
    x /= 10;
  }
  while (top) {
    putchar(a[top]);
    top--;
  }
}
int n, m, i, j, lst, t[100005], w[100005], col[100005], dfn[100005],
    fa[100005][19], dep[100005], stk[100005], tp, blk, ti, a[100005],
    ixt[100005], ans[100005], cur, dup[100005], ixf[100005], cq, duv[100005];
vector<int> e[100005], ee[100005], all, tmp;
vector<pair<int, int> > dur[100005];
int seq[100005];
void add(int x, int y) {
  all.push_back(x);
  all.push_back(y);
  ee[x].push_back(y);
  ee[y].push_back(x);
}
int lca(int x, int y) {
  if (dep[x] < dep[y]) {
    swap(x, y);
  }
  int t = dep[x] - dep[y], i;
  for ((i) = (18); (i) >= (0); (i)--) {
    if ((t >> i) & 1) {
      x = fa[x][i];
    }
  }
  if (x == y) return x;
  for ((i) = (18); (i) >= (0); (i)--) {
    if (fa[x][i] != fa[y][i]) {
      x = fa[x][i];
      y = fa[y][i];
    }
  }
  return fa[x][0];
}
void dfs(int x) {
  dfn[x] = ++ti;
  for (__typeof((e[x]).begin()) it = (e[x]).begin(); it != (e[x]).end(); it++) {
    dep[*it] = dep[x] + 1;
    dfs(*it);
  }
}
void dfs2(int x) {
  for (__typeof((e[x]).begin()) it = (e[x]).begin(); it != (e[x]).end(); it++) {
    dfs2(*it);
    w[x] += w[*it];
  }
}
bool cmp(int x, int y) { return dfn[x] < dfn[y]; }
void ins(int x) {
  if (tp <= 1) {
    stk[++tp] = x;
    return;
  }
  int z = lca(stk[tp], x);
  if (z == stk[tp]) {
    stk[++tp] = x;
    return;
  }
  while (tp > 1 && dfn[stk[tp - 1]] >= dfn[z]) {
    add(stk[tp], stk[tp - 1]);
    tp--;
  }
  if (stk[tp] != z) {
    add(stk[tp], z);
    stk[tp] = z;
  }
  stk[++tp] = x;
}
void ine(int x, int y) {
  int id = y;
  duv[id] = 0;
  y = fa[y][0];
  tmp.clear();
  while (y != x) {
    ixt[y] = 1;
    if (!col[y]) tmp.push_back(t[y] - w[y]);
    y = fa[y][0];
  }
  sort(tmp.begin(), tmp.end());
  dur[id].clear();
  for (__typeof((tmp).begin()) it = (tmp).begin(); it != (tmp).end(); it++) {
    if (dur[id].empty()) {
      dur[id].push_back(make_pair(*it, 1));
    } else if (dur[id].back().first == *it) {
      dur[id].back().second++;
    } else {
      dur[id].push_back(make_pair(*it, dur[id].back().second + 1));
    }
  }
  for (dup[id] = 0; dup[id] < dur[id].size(); dup[id]++)
    if (duv[id] <= dur[id][dup[id]].first) break;
  dup[id]--;
  cur += (dup[id] == -1 ? 0 : dur[id][dup[id]].second);
}
void dfs3(int x, int fa) {
  ixf[x] = fa;
  ixt[x] = 1;
  if (!col[x]) cur += (w[x] > t[x]);
  for (__typeof((ee[x]).begin()) it = (ee[x]).begin(); it != (ee[x]).end();
       it++)
    if (*it != fa) {
      ine(x, *it);
      dfs3(*it, x);
    }
}
void dfs4(int x) {
  if (!ixt[x]) {
    if (!col[x]) cur += (w[x] > t[x]);
  }
  for (__typeof((e[x]).begin()) it = (e[x]).begin(); it != (e[x]).end(); it++) {
    dfs4(*it);
  }
}
void upe(int x, int dlt) {
  duv[x] += dlt;
  cur -= (dup[x] == -1 ? 0 : dur[x][dup[x]].second);
  while (dup[x] + 1 < dur[x].size() && duv[x] > dur[x][dup[x] + 1].first)
    dup[x]++;
  while (dup[x] > -1 && duv[x] <= dur[x][dup[x]].first) dup[x]--;
  cur += (dup[x] == -1 ? 0 : dur[x][dup[x]].second);
}
void work(int x) {
  int dlt = x / abs(x), fst = 1;
  x = abs(x);
  while (x) {
    if (!col[x]) cur -= (w[x] > t[x]);
    if (fst) col[x] += dlt;
    fst = 0;
    w[x] += dlt;
    if (!col[x]) cur += (w[x] > t[x]);
    if (x != 1) upe(x, dlt);
    x = ixf[x];
  }
}
void solve(int ed) {
  int i;
  cur = 0;
  all.clear();
  memset(w, 0, sizeof(w));
  memset(ixt, 0, sizeof(ixt));
  for (((i)) = (1); ((i)) <= ((lst)); ((i))++) {
    if (seq[i] > 0) {
      w[seq[i]] = col[seq[i]] = 1;
    } else {
      w[-seq[i]] = col[-seq[i]] = 0;
    }
  }
  dfs2(1);
  for ((i) = (lst + 1); (i) <= (ed); (i)++) {
    a[i - lst] = abs(seq[i]);
  }
  sort(a + 1, a + (ed - lst) + 1, cmp);
  stk[tp = 1] = 1;
  for (((i)) = (1); ((i)) <= ((ed - lst)); ((i))++) {
    if (a[i] != 1 && a[i] != a[i - 1]) {
      ins(a[i]);
    }
  }
  while (tp >= 2) {
    add(stk[tp], stk[tp - 1]);
    tp--;
  }
  dfs3(1, 0);
  dfs4(1);
  for ((i) = (lst + 1); (i) <= (ed); (i)++) {
    work(seq[i]);
    printf("%d ", cur);
  }
  for (__typeof((all).begin()) it = (all).begin(); it != (all).end(); it++) {
    ee[*it].clear();
  }
}
int main() {
  read(n);
  read(m);
  blk = sqrt(m) * 2;
  for ((i) = (2); (i) <= (n); (i)++) {
    scanf("%d", &fa[i][0]);
    e[fa[i][0]].push_back(i);
  }
  for (((j)) = (1); ((j)) <= ((18)); ((j))++)
    for (((i)) = (1); ((i)) <= ((n)); ((i))++) {
      fa[i][j] = fa[fa[i][j - 1]][j - 1];
    }
  for (((i)) = (1); ((i)) <= ((n)); ((i))++) {
    scanf("%d", &t[i]);
  }
  dfs(1);
  lst = 0;
  for (((i)) = (1); ((i)) <= ((m)); ((i))++) {
    scanf("%d", &seq[i]);
    if (i % blk == 0) {
      solve(i);
      lst = i;
    }
  }
  if (lst < m) solve(m);
  return 0;
}
