#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, seg[4 * N], lazy[4 * N], a[N], tin[N], tout[N], rev[N], timer;
vector<int> adj[N];
void dfs(int node) {
  tin[node] = ++timer;
  rev[timer] = node;
  for (auto &v : adj[node]) dfs(v);
  tout[node] = timer;
}
void build(int l, int r, int node) {
  if (l == r) {
    seg[node] = a[rev[l]];
    return;
  }
  int mid = (l + r) >> 1;
  build(l, mid, 2 * node);
  build(mid + 1, r, 2 * node + 1);
  seg[node] = seg[2 * node] + seg[2 * node + 1];
}
void push(int l, int r, int node) {
  if (!lazy[node]) return;
  seg[node] = r - l + 1 - seg[node];
  if (l != r) {
    lazy[2 * node] = 1 - lazy[2 * node];
    lazy[2 * node + 1] = 1 - lazy[2 * node + 1];
  }
  lazy[node] = 0;
}
void update(int l, int r, int node, int ql, int qr) {
  push(l, r, node);
  if (r < ql || qr < l) return;
  if (ql <= l && r <= qr) {
    lazy[node] ^= 1;
    push(l, r, node);
    return;
  }
  int mid = (l + r) >> 1;
  update(l, mid, 2 * node, ql, qr);
  update(mid + 1, r, 2 * node + 1, ql, qr);
  seg[node] = seg[2 * node] + seg[2 * node + 1];
}
int query(int l, int r, int node, int ql, int qr) {
  push(l, r, node);
  if (r < ql || qr < l) return 0;
  if (ql <= l && r <= qr) return seg[node];
  int mid = (l + r) >> 1;
  return query(l, mid, 2 * node, ql, qr) +
         query(mid + 1, r, 2 * node + 1, ql, qr);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n;
  for (int i = 2, p; i <= n; i++) {
    cin >> p;
    adj[p].push_back(i);
  }
  dfs(1);
  for (int i = 1; i <= n; i++) cin >> a[i];
  build(1, n, 1);
  int q;
  cin >> q;
  while (q--) {
    string s;
    cin >> s;
    int node;
    cin >> node;
    if (s[0] == 'g')
      cout << query(1, n, 1, tin[node], tout[node]) << "\n";
    else
      update(1, n, 1, tin[node], tout[node]);
  }
}
