#include <bits/stdc++.h>   using namespace std;   int n, m, x, c, a[200001], tin[200001], tout[200001], sz[200001], seg[524288];   string s;   bool lazy[524288];   vector<int> G[200001];   void dfs(int i) {     tin[i] = ++c;     ++sz[i];     for (int j : G[i]) {       dfs(j);       sz[i] += sz[j];     }     tout[i] = c;   }   void upd(int l, int r, int s = 1, int e = n, int i = 1) {     if (lazy[i]) {       seg[i] = (e - s + 1) - seg[i];       if (s != e) {         lazy[2 * i] ^= 1;         lazy[2 * i + 1] ^= 1;       }       lazy[i] = 0;     }     if (s > r || e < l) return;     if (s >= l && e <= r) {       seg[i] = (e - s + 1) - seg[i];       if (s != e) {         lazy[2 * i] ^= 1;         lazy[2 * i + 1] ^= 1;       }       return;     }     int mid = (s + e) / 2;     upd(l, r, s, mid, 2 * i);     upd(l, r, mid + 1, e, 2 * i + 1);     seg[i] = seg[2 * i] + seg[2 * i + 1];   }   int que(int l, int r, int s = 1, int e = n, int i = 1) {     if (lazy[i]) {       seg[i] = (e - s + 1) - seg[i];       if (s != e) {         lazy[2 * i] ^= 1;         lazy[2 * i + 1] ^= 1;       }       lazy[i] = 0;     }     if (s > r || e < l) return 0;     if (s >= l && e <= r) return seg[i];     int mid = (s + e) / 2;     return que(l, r, s, mid, 2 * i) + que(l, r, mid + 1, e, 2 * i + 1);   }   int main() {     ios::sync_with_stdio(0);     cin.tie(0);     cin >> n;     for (int i = 2; i <= n; ++i) {       cin >> x;       G[x].push_back(i);     }     for (int i = 1; i <= n; ++i) cin >> a[i];     dfs(1);     for (int i = 1; i <= n; ++i)       if (a[i]) upd(tin[i], tin[i]);     cin >> m;     while (m--) {       cin >> s >> x;       if (s ==  pow )         upd(tin[x], tout[x]);       else         cout << que(tin[x], tout[x]) <<   n ;     }   }   