#include <bits/stdc++.h>
using namespace std;
const int LOG = 18;
const int NN = 2e5 + 5;
const int MOD = (int)1e9 + 7;
const int INF = 1LL << 28;
vector<int> adj[NN];
int ID[NN];
int subtree[NN];
int sz;
int n;
int dfs(int node) {
  subtree[node] = 1;
  for (int child : adj[node]) {
    subtree[node] += dfs(child);
  }
  ID[node] = sz++;
  return subtree[node];
}
int res[NN * 4 * 2];
int lazy[NN * 4 * 2];
void inverse(int l, int r, int idx, int ql, int qr) {
  if (l > r) return;
  if (lazy[idx]) {
    lazy[idx * 2] ^= 1;
    lazy[idx * 2 + 1] ^= 1;
    res[idx] = r - l + 1 - res[idx];
    lazy[idx] = 0;
  }
  if (qr < l || ql > r) return;
  if (ql <= l && r <= qr) {
    lazy[idx * 2] ^= 1;
    lazy[idx * 2 + 1] ^= 1;
    res[idx] = r - l + 1 - res[idx];
    return;
  }
  int mid = (l + r) >> 1;
  inverse(l, mid, idx * 2, ql, qr);
  inverse(mid + 1, r, idx * 2 + 1, ql, qr);
  res[idx] = res[idx * 2] + res[idx * 2 + 1];
}
int query(int l, int r, int idx, int ql, int qr) {
  if (l > r) return 0;
  if (lazy[idx]) {
    lazy[idx * 2] ^= 1;
    lazy[idx * 2 + 1] ^= 1;
    res[idx] = r - l + 1 - res[idx];
    lazy[idx] = 0;
  }
  if (qr < l || ql > r) return 0;
  if (ql <= l && r <= qr) {
    return res[idx];
  }
  int mid = (l + r) >> 1;
  int A = query(l, mid, idx * 2, ql, qr);
  int B = query(mid + 1, r, idx * 2 + 1, ql, qr);
  return A + B;
}
int main() {
  ios_base::sync_with_stdio(0);
  scanf("%d", &n);
  for (int i = 2; i <= n; i++) {
    int x;
    scanf("%d", &x);
    adj[x].push_back(i);
  }
  sz = 0;
  dfs(1);
  memset(res, 0, sizeof(res));
  for (int i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    if (x == 1) {
      inverse(0, n - 1, 1, ID[i], ID[i]);
    }
  }
  int q;
  scanf("%d", &q);
  char cmd[10];
  int node;
  for (int i = 1; i <= q; i++) {
    scanf("%s%d", cmd, &node);
    int idx = ID[node];
    int l = idx - subtree[node] + 1, r = idx;
    if (cmd[0] == 'g') {
      printf("%d\n", query(0, n - 1, 1, l, r));
    } else {
      inverse(0, n - 1, 1, l, r);
    }
  }
  return 0;
}
