func_code_string: #include <bits/stdc++.h>   using namespace std;   inline long long read() {     long long sum = 0, ff = 1;     char ch = getchar();     while (ch <  0  || ch >  9 ) {       if (ch ==  - ) ff = -1;       ch = getchar();     }     while (ch >=  0  && ch <=  9 ) sum = sum * 10 + ch -  0 , ch = getchar();     return sum * ff;   }   const int N = 100007;   const int block = 500;   int n, m, a_st[N], a[N], x, y, num, belong[N], st[N / block + 7],       ed[N / block + 7], col[N], sum[N / block + 7][N * 2], tag[N / block + 7],       ans;   struct edge {     int to, nxt;   } e[N];   int cnt, he[N];   void add(int u, int v) {     e[++cnt].to = v;     e[cnt].nxt = he[u];     he[u] = cnt;   }   int deep[N], siz[N], fa[N], son[N], dfs_cnt, dfn[N], top[N];   void dfs1(int u, int fat) {     deep[u] = deep[fat] + 1;     siz[u] = 1;     fa[u] = fat;     for (int i = he[u]; i; i = e[i].nxt) {       int v = e[i].to;       if (v == fat) continue;       dfs1(v, u);       siz[u] += siz[v];       if (siz[v] > siz[son[u]]) son[u] = v;     }   }   void dfs2(int u, int tp) {     top[u] = tp;     dfn[u] = ++dfs_cnt;     if (!son[u]) return;     dfs2(son[u], tp);     for (int i = he[u]; i; i = e[i].nxt) {       int v = e[i].to;       if (top[v]) continue;       dfs2(v, v);     }   }   void build() {     for (int i = 1; i <= n; i++) belong[i] = (i - 1) / block + 1;     num = belong[n];     for (int i = 1; i <= num; i++) st[i] = (i - 1) * block + 1, ed[i] = i * block;     ed[num] = n;   }   void change(int x, int y) {     col[x] ^= 1;     if (a[x] >= n + 1 - tag[belong[x]]) ans -= y;     sum[belong[x]][a[x]] -= y;   }   void upd(int l, int r, int val) {     for (int i = l; i <= r; i++) {       if (!col[i] && a[i] >= n + 1 - tag[belong[i]]) ans--;       if (!col[i]) sum[belong[i]][a[i]]--;       a[i] += val;       if (!col[i]) sum[belong[i]][a[i]]++;       if (!col[i] && a[i] >= n + 1 - tag[belong[i]]) ans++;     }   }   void modify(int l, int r, int val) {     if (belong[l] == belong[r]) {       upd(l, r, val);       return;     }     upd(l, ed[belong[l]], val), upd(st[belong[r]], r, val);     for (int i = belong[l] + 1; i < belong[r]; i++) {       if (val == 1)         tag[i]++, ans += sum[i][n + 1 - tag[i]];       else         ans -= sum[i][n + 1 - tag[i]], tag[i]--;     }   }   int main() {     n = read(), m = read();     for (int i = 2; i <= n; i++) fa[i] = read(), add(fa[i], i);     for (int i = 1; i <= n; i++) a_st[i] = read();     dfs1(1, 0);     dfs2(1, 1);     for (int i = 1; i <= n; i++) a[dfn[i]] = n - a_st[i];     build();     for (int i = 1; i <= n; i++) sum[belong[i]][a[i]]++;     for (int i = 1; i <= m; i++) {       x = read();       y = (x > 0) ? 1 : -1;       x = abs(x);       change(dfn[x], y);       while (x) {         modify(dfn[top[x]], dfn[x], y);         x = fa[top[x]];       }       cout << ans <<    ;     }     return 0;   }   