#include <bits/stdc++.h>
using namespace std;
const long long mod = 1000000007;
long long powmod(long long a, long long b) {
  long long res = 1;
  a %= mod;
  assert(b >= 0);
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
  }
  return res;
}
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
const int N = 101000;
const int LIM = 300;
int q[N], hs[N], hv[N], dep[N], id[N], l[N], r[N], bel[N], f[N], s[N], t[N],
    off[N];
int n, p, tot, ans, v, m, in[N];
vector<int> cc[N], e[N];
vector<pair<int, int> >::iterator pit[N];
vector<pair<int, int> > zz[N];
void dfs(int u, int f) {
  id[l[u] = ++tot] = u;
  dep[u] = dep[f] + 1;
  if (hv[u]) dfs(hv[u], u);
  for (int j = 0; j < ((int)(e[u]).size()); j++)
    if (e[u][j] != f && e[u][j] != hv[u]) dfs(e[u][j], u);
  r[u] = tot;
}
void build(int u) {
  vector<pair<int, int> > tmp;
  int v = cc[u].back();
  while (1) {
    t[v] += off[u];
    tmp.push_back(make_pair(t[v], in[v]));
    if (v == u) break;
    v = f[v];
  }
  sort((tmp).begin(), (tmp).end());
  for (auto p : zz[u])
    if (p.first + off[u] < 0) ans -= p.second;
  off[u] = 0;
  zz[u].clear();
  int val = -(1 << 30), cnt = 0;
  for (int i = 0; i < ((int)(tmp).size()); i++) {
    if (tmp[i].first == val)
      cnt += tmp[i].second;
    else {
      if (val > -(1 << 30)) zz[u].push_back(make_pair(val, cnt));
      val = tmp[i].first;
      cnt = tmp[i].second;
    }
  }
  zz[u].push_back(make_pair(val, cnt));
  pit[u] = zz[u].begin();
  while (pit[u] != zz[u].end() && pit[u]->first < 0) ++pit[u];
  for (auto p : zz[u])
    if (p.first < 0) ans += p.second;
}
bool rrt[N];
void HLDoT(int rt) {
  int t = 1;
  q[0] = rt;
  for (int i = 0; i < n; i++) {
    int u = q[i];
    for (int j = 0; j < ((int)(e[u]).size()); j++)
      if (e[u][j] != f[u]) f[e[u][j]] = u, dep[q[t++] = e[u][j]] = dep[u] + 1;
  }
  for (int i = n - 1; i >= 0; i--) {
    int u = q[i], p = f[u];
    s[u]++, s[p] += s[u];
    if (!l[u]) l[u] = 1;
    if (hs[p] < s[u]) hs[p] = s[u], hv[p] = u, l[p] = l[u] + 1;
  }
  for (int i = 0; i < n; i++) {
    int u = q[i];
    if (!bel[u]) bel[u] = u;
    if (hv[u]) bel[hv[u]] = bel[u];
  }
  dfs(rt, 0);
  for (int i = 1; i < n + 1; i++)
    if (bel[i] == i) rrt[i] = 1;
  for (int i = 1; i < n + 1; i++)
    if (rrt[i]) {
      int u = i;
      vector<int> chain;
      chain.push_back(u);
      while (hv[u]) {
        u = hv[u];
        chain.push_back(u);
      }
      int curf = chain[0];
      for (int i = 0; i < ((int)(chain).size()); i++) {
        if (i % LIM == 0) curf = chain[i];
        bel[chain[i]] = curf;
        cc[curf].push_back(chain[i]);
      }
    }
  for (int i = 1; i < n + 1; i++)
    if (bel[i] == i) build(i);
}
void modify(int u, int x) {
  if (x == -1) {
    in[u] = 0;
    if (t[u] + off[bel[u]] < 0) ans--;
    for (auto &p : zz[bel[u]])
      if (p.first == t[u]) p.second--;
  } else {
    in[u] = 1;
    if (t[u] + off[bel[u]] < 0) ans++;
    for (auto &p : zz[bel[u]])
      if (p.first == t[u]) p.second++;
  }
  u = f[u];
  while (u) {
    int v = bel[u];
    if (cc[v].back() == u) {
      off[v] += x;
      while (pit[v] != zz[v].end() && pit[v]->first + off[v] < 0) {
        ans += pit[v]->second;
        pit[v]++;
      }
      while (pit[v] != zz[v].begin() && (pit[v] - 1)->first + off[v] >= 0) {
        ans -= (pit[v] - 1)->second;
        pit[v]--;
      }
    } else {
      while (1) {
        t[u] += x;
        if (u == v) break;
        u = f[u];
      }
      build(v);
    }
    u = f[v];
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i < n + 1; i++) in[i] = 1;
  for (int i = 2; i < n + 1; i++) {
    scanf("%d", &p);
    e[p].push_back(i);
  }
  for (int i = 1; i < n + 1; i++) scanf("%d", t + i);
  HLDoT(1);
  for (int i = 0; i < m; i++) {
    scanf("%d", &v);
    if (v > 0)
      modify(v, -1);
    else
      modify(-v, 1);
    printf("%d%c", ans, " \n"[i == m - 1]);
  }
}
