#include <bits/stdc++.h>   using namespace std;   inline int read() {     int s = 0, f = 1;     char ch = getchar();     while (ch <  0  || ch >  9 ) {       if (ch ==  - ) f = -1;       ch = getchar();     }     while (ch >=  0  && ch <=  9 )       s = (s << 3) + (s << 1) + ch -  0 , ch = getchar();     return s * f;   }   const int N = 1e5 + 5, M = 320;   int n, m, fa[N], top[N], t[N], sz[N], son[N];   struct Edge {     int to, next;   } e[N];   int head[N], ecnt, id[N], pos[N], L[M], R[M];   inline void adde(int u, int v) {     e[++ecnt].next = head[u];     e[ecnt].to = v;     head[u] = ecnt;   }   void dfs1(int u) {     sz[u] = 1;     for (int i = head[u], v; i; i = e[i].next) {       v = e[i].to;       dfs1(v);       sz[u] += sz[v];       if (sz[son[u]] < sz[v]) son[u] = v;     }   }   int inde, p[N], cnt[M][N], ans, tag[M], blk, blksz;   void dfs2(int u, int fr) {     id[u] = ++inde;     p[inde] = u;     top[u] = fr;     ++cnt[pos[inde]][t[u]];     if (son[u]) dfs2(son[u], fr);     for (int i = head[u], v; i; i = e[i].next) {       v = e[i].to;       if (v != son[u]) dfs2(v, v);     }   }   bool black[N];   inline void modify_blk(int x, int l, int r, int val) {     if (l <= L[x] && R[x] <= r) {       if (val > 0) {         ++tag[x];         ans += cnt[x][tag[x]];       } else {         ans -= cnt[x][tag[x]];         --tag[x];       }     } else {       for (int i = max(l, L[x]), u; i <= min(r, R[x]); ++i) {         u = p[i];         if (black[u]) {           if (val > 0)             --t[u];           else             ++t[u];           continue;         }         if (val > 0) {           --cnt[x][t[u]];           ++cnt[x][--t[u]];           if (t[u] == tag[x]) ++ans;         } else {           --cnt[x][t[u]];           if (t[u] == tag[x]) --ans;           ++cnt[x][++t[u]];         }       }     }   }   inline void modify_node(int u, int val) {     if (black[u] && !val) {       ++cnt[pos[id[u]]][t[u]];       if (t[u] <= tag[pos[id[u]]]) ++ans;     } else if (!black[u] && val) {       --cnt[pos[id[u]]][t[u]];       if (t[u] <= tag[pos[id[u]]]) --ans;     }     black[u] = val;   }   inline void modify(int x, int val) {     if (black[x] == val) return;     modify_node(x, val);     int u = fa[x], l, r;     while (u) {       l = id[top[u]];       r = id[u];       if (pos[l] == pos[r]) {         modify_blk(pos[l], l, r, black[x]);       } else {         modify_blk(pos[l], l, r, black[x]);         modify_blk(pos[r], l, r, black[x]);         for (int i = pos[l] + 1; i < pos[r]; ++i) modify_blk(i, l, r, black[x]);       }       u = fa[top[u]];     }   }   int main() {     n = read();     m = read();     for (int i = 2; i <= n; ++i) fa[i] = read(), adde(fa[i], i);     for (int i = 1; i <= n; ++i) t[i] = read() + 1;     blksz = min(N / (M - 2), int(sqrt(n)));     blk = (n - 1) / blksz + 1;     for (int i = 1; i <= n; ++i) pos[i] = (i - 1) / blksz + 1;     for (int i = 1; i <= blk; ++i) L[i] = (i - 1) * blksz + 1, R[i] = i * blksz;     R[blk] = n;     dfs1(1);     dfs2(1, 0);     while (m--) {       int node = read(), val = 1;       if (node < 0) node = -node, val = 0;       modify(node, val);       printf( %d  , ans);     }     return 0;   }   