#include <bits/stdc++.h>
using namespace std;
int tree[800010], lazy[800100], a[200010], b[200010], n, m = 0;
void updateRangeUtil(int si, int ss, int se, int us, int ue, int diff) {
  if (lazy[si]) {
    if (lazy[si] & 1) tree[si] = se - ss + 1 - tree[si];
    if (ss != se) {
      lazy[si * 2 + 1] += lazy[si];
      lazy[si * 2 + 2] += lazy[si];
    }
    lazy[si] = 0;
  }
  if (ss > se || ss > ue || se < us) return;
  if (ss >= us && se <= ue) {
    tree[si] = se - ss + 1 - tree[si];
    if (ss != se) {
      lazy[si * 2 + 1] += diff;
      lazy[si * 2 + 2] += diff;
    }
    return;
  }
  int mid = (ss + se) / 2;
  updateRangeUtil(si * 2 + 1, ss, mid, us, ue, diff);
  updateRangeUtil(si * 2 + 2, mid + 1, se, us, ue, diff);
  tree[si] = tree[si * 2 + 1] + tree[si * 2 + 2];
}
void updateRange(int us, int ue, int diff) {
  updateRangeUtil(0, 0, n - 1, us, ue, diff);
}
int getSumUtil(int ss, int se, int qs, int qe, int si) {
  if (lazy[si]) {
    if (lazy[si] & 1) tree[si] = se - ss + 1 - tree[si];
    if (ss != se) {
      lazy[si * 2 + 1] += lazy[si];
      lazy[si * 2 + 2] += lazy[si];
    }
    lazy[si] = 0;
  }
  if (ss > se || ss > qe || se < qs) return 0;
  if (ss >= qs && se <= qe) return tree[si];
  int mid = (ss + se) / 2;
  return getSumUtil(ss, mid, qs, qe, 2 * si + 1) +
         getSumUtil(mid + 1, se, qs, qe, 2 * si + 2);
}
int getSum(int qs, int qe) { return getSumUtil(0, n - 1, qs, qe, 0); }
void constructUtil(int ss, int se, int si) {
  if (ss > se) return;
  if (ss == se) {
    tree[si] = a[ss];
    return;
  }
  int mid = (ss + se) / 2;
  constructUtil(ss, mid, si * 2 + 1);
  constructUtil(mid + 1, se, si * 2 + 2);
  tree[si] = tree[si * 2 + 1] + tree[si * 2 + 2];
  m = (si > m) ? m : si;
}
void construct() {
  constructUtil(0, n - 1, 0);
  for (int i = 0; i < m; ++i) lazy[i] = 0;
}
bool vi[200010];
int in = 0, q, v, chcnt[200010];
vector<int> ch[200010];
int dfs(int now) {
  int tmp = 0;
  vi[now] = true;
  b[now] = in;
  ++in;
  for (auto it : ch[now]) {
    if (!vi[it]) {
      tmp += dfs(it);
    }
  }
  return chcnt[now] = tmp + 1;
}
int main() {
  cin >> n;
  memset(vi, false, sizeof vi);
  int par;
  for (int i = 2; i <= n; ++i) {
    cin >> par;
    ch[par].push_back(i);
  }
  dfs(1);
  for (int i = 1; i <= n; ++i) {
    cin >> par;
    a[b[i]] = par;
  }
  construct();
  cin >> q;
  string com;
  while (q--) {
    cin >> com >> v;
    if (com[0] == 'g') {
      cout << getSum(b[v], b[v] + chcnt[v] - 1) << endl;
    } else {
      updateRange(b[v], b[v] + chcnt[v] - 1, 1);
    }
  }
  return 0;
}
