func_code_string: #include <bits/stdc++.h>   const int B = 500;   using namespace std;   const long long inf = 1e9 + 12;   long long mod = 1e9 + 7;   const long long mxn = 4e5 + 5;   const int N = 10000005;   const double pi = 3.14159;   int dx[] = {0, 1, 0, -1, 1, -1, 1, -1};   int dy[] = {1, 0, -1, 0, -1, 1, 1, -1};   long long m, n, k, y, z;   vector<int> g[mxn];   int timer = 0;   int st[mxn], ed[mxn], d[mxn], tree[mxn << 4], lazy[mxn << 4];   bool lit[mxn];   void dfs(int v, int p) {     timer++;     st[v] = timer;     for (auto u : g[v]) {       if (u == p) continue;       dfs(u, v);     }     timer++;     ed[v] = timer;   }   void push_up(int node, int l, int r) {     int mid = (l + r) >> 1;     tree[node] = (lazy[2 * node] % 2 == 0 ? (tree[2 * node])                                           : (mid - l + 1 - tree[2 * node])) +                  (lazy[2 * node + 1] % 2 == 0 ? (tree[2 * node + 1])                                               : (r - mid - tree[2 * node + 1]));   }   void upd(int node, int l, int r, int ql, int qr, int t) {     if (ql > r || qr < l) return;     if (l >= ql && r <= qr) {       if (t)         lazy[node]++;       else         tree[node] = r - l + 1;       return;     }     int mid = (l + r) >> 1;     upd(2 * node, l, mid, ql, qr, t), upd(2 * node + 1, mid + 1, r, ql, qr, t);     push_up(node, l, r);   }   int qry(int node, int l, int r, int ql, int qr, int val) {     if (ql > r || qr < l) return 0;     if (l >= ql && r <= qr) {       val += lazy[node];       if (val % 2 == 0)         return tree[node];       else         return r - l + 1 - tree[node];     }     int mid = (l + r) >> 1;     return qry(2 * node, l, mid, ql, qr, val + lazy[node]) +            qry(2 * node + 1, mid + 1, r, ql, qr, val + lazy[node]);   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0), cout.tie(0);     cin >> n;     for (int i = 2; i <= n; i++) {       int x;       cin >> x;       g[x].push_back(i), g[i].push_back(x);     }     dfs(1, 0);     for (int i = 1; i <= n; i++) {       int x;       cin >> x;       lit[i] = x;       if (x) upd(1, 1, 2 * n, st[i], st[i], 0), upd(1, 1, 2 * n, ed[i], ed[i], 0);     }     cin >> k;     int t;     while (k--) {       string s;       cin >> s >> t;       if (s[0] ==  g ) {         cout << qry(1, 1, 2 * n, st[t], ed[t], 0) / 2 << endl;       } else {         upd(1, 1, 2 * n, st[t], ed[t], 1);       }     }   }   