#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);
    }
  }
}
