func_code_string: #include <bits/stdc++.h>   using namespace std;   vector<long long> v[200010];   vector<long long> traversal;   long long cnt;   long long color[200010];   long long start[200010];   long long enddd[200010];   void dfs(long long curr) {     start[curr] = cnt;     traversal.push_back(curr);     cnt++;     for (int i = 0; i < v[curr].size(); i++) {       dfs(v[curr][i]);     }     enddd[curr] = cnt;   }   long long tree[800010];   long long lazy[800010];   void build_tree(int node, int a, int b) {     if (a > b) return;     if (a == b) {       tree[node] = color[traversal[a]];       return;     }     build_tree(node * 2, a, (a + b) / 2);     build_tree(node * 2 + 1, 1 + (a + b) / 2, b);     tree[node] = tree[node * 2] + tree[node * 2 + 1];   }   void update_tree(int node, int a, int b, int i, int j, int value) {     if (lazy[node] != 0) {       tree[node] = (b - a + 1 - tree[node]);       if (a != b) {         lazy[node * 2] += lazy[node];         lazy[node * 2 + 1] += lazy[node];         lazy[node * 2] %= 2;         lazy[node * 2 + 1] %= 2;       }       lazy[node] = 0;     }     if (a > b || a > j || b < i) return;     if (a >= i && b <= j) {       tree[node] = (b - a + 1 - tree[node]);       if (a != b) {         lazy[node * 2] += value;         lazy[node * 2 + 1] += value;         lazy[node * 2] %= 2;         lazy[node * 2 + 1] %= 2;       }       return;     }     update_tree(node * 2, a, (a + b) / 2, i, j, value);     update_tree(1 + node * 2, 1 + (a + b) / 2, b, i, j, value);     tree[node] = tree[node * 2] + tree[node * 2 + 1];   }   int query_tree(int node, int a, int b, int i, int j) {     if (a > b || a > j || b < i) return 0;     if (lazy[node] != 0) {       tree[node] = (b - a + 1 - tree[node]);       if (a != b) {         lazy[node * 2] += lazy[node];         lazy[node * 2 + 1] += lazy[node];         lazy[node * 2] %= 2;         lazy[node * 2 + 1] %= 2;       }       lazy[node] = 0;     }     if (a >= i && b <= j) return tree[node];     int q1 = query_tree(node * 2, a, (a + b) / 2, i, j);     int q2 = query_tree(1 + node * 2, 1 + (a + b) / 2, b, i, j);     int res = q1 + q2;     return res;   }   char str[4];   int main() {     long long n, temp;     cin >> n;     cnt = 0;     for (int i = 2; i <= n; i++) {       cin >> temp;       v[temp].push_back(i);     }     for (int i = 1; i <= n; i++) {       cin >> color[i];     }     dfs(1);     build_tree(1, 0, cnt - 1);     long long q;     cin >> q;     long long vertex;     while (q--) {       scanf( %s , str);       cin >> vertex;       if (str[0] ==  p ) {         update_tree(1, 0, cnt - 1, start[vertex], enddd[vertex] - 1, 1);       } else {         cout << query_tree(1, 0, cnt - 1, start[vertex], enddd[vertex] - 1)              << endl;       }     }   }   