func_code_string: #include <bits/stdc++.h>   using namespace std;   const int M = 1e6 + 10;   struct node {     int l, r, sum, mus;   } tr[M];   int n, a[M], now[M], sz[M], place[M], q, p;   vector<int> g[M];   void maket(int l, int r, int t) {     tr[t].l = l;     tr[t].r = r;     if (l == r) {       tr[t].sum += now[a[l]];       return;     }     maket(l, (l + r) / 2, 2 * t);     maket((l + r) / 2 + 1, r, 2 * t + 1);     tr[t].sum = tr[2 * t].sum + tr[2 * t + 1].sum;   }   void change(int l, int r, int t) {     if (tr[t].l == l && tr[t].r == r) {       tr[t].sum = r - l + 1 - tr[t].sum;       tr[t].mus ^= 1;       return;     }     if (tr[t].mus) {       change(tr[2 * t].l, tr[2 * t].r, 2 * t);       change(tr[2 * t + 1].l, tr[2 * t + 1].r, 2 * t + 1);       tr[t].mus = 0;     }     if (r <= tr[2 * t].r)       change(l, r, 2 * t);     else if (l >= tr[2 * t + 1].l)       change(l, r, 2 * t + 1);     else {       change(l, tr[2 * t].r, 2 * t);       change(tr[2 * t + 1].l, r, 2 * t + 1);     }     tr[t].sum = tr[2 * t].sum + tr[2 * t + 1].sum;   }   int query(int l, int r, int t) {     if (tr[t].l == l && tr[t].r == r) return tr[t].sum;     if (tr[t].mus) {       change(tr[2 * t].l, tr[2 * t].r, 2 * t);       change(tr[2 * t + 1].l, tr[2 * t + 1].r, 2 * t + 1);       tr[t].mus = 0;     }     if (r <= tr[2 * t].r)       return query(l, r, 2 * t);     else if (l >= tr[2 * t + 1].l)       return query(l, r, 2 * t + 1);     else       return query(l, tr[2 * t].r, 2 * t) + query(tr[2 * t + 1].l, r, 2 * t + 1);     tr[t].sum = tr[2 * t].sum + tr[2 * t + 1].sum;   }   void dfs(int v) {     a[++p] = v;     place[v] = p;     sz[v] = 1;     for (int i = 0; i < g[v].size(); i++) {       dfs(g[v][i]);       sz[v] += sz[g[v][i]];     }   }   int main() {     cin >> n;     for (int i = 2; i <= n; i++) {       int x;       scanf( %d , &x);       g[x].push_back(i);     }     for (int i = 1; i <= n; i++) scanf( %d , now + i);     dfs(1);     maket(1, n, 1);     cin >> q;     while (q--) {       string s;       cin >> s;       int v;       scanf( %d , &v);       if (s ==  get )         printf( %d n , query(place[v], place[v] + sz[v] - 1, 1));       else         change(place[v], place[v] + sz[v] - 1, 1);     }     return 0;   }   