#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const double eps = 1e-6;
const int MAXN = 2e5 + 10;
const int MAXM = 1e6 + 10;
const long long mod = 1e9 + 7;
vector<int> vec[MAXN];
int a[MAXN], lef[MAXN], rig[MAXN];
int sum[MAXN << 2], lazy[MAXN << 2];
int tot = 1;
void pushdown(int o, int l, int r) {
  if (l == r || lazy[o] == 0) return;
  int mid = (l + r) >> 1;
  sum[o << 1] = mid - l + 1 - sum[o << 1];
  sum[o << 1 | 1] = r - mid - sum[o << 1 | 1];
  lazy[o << 1] ^= 1;
  lazy[o << 1 | 1] ^= 1;
  lazy[o] ^= 1;
}
void change(int o, int l, int r, int L, int R) {
  pushdown(o, l, r);
  if (l >= L && r <= R) {
    sum[o] = r - l + 1 - sum[o];
    lazy[o] ^= 1;
    return;
  }
  int mid = (l + r) >> 1;
  if (mid >= L) change(o << 1, l, mid, L, R);
  if (mid < R) change(o << 1 | 1, mid + 1, r, L, R);
  sum[o] = sum[o << 1] + sum[o << 1 | 1];
}
int get(int o, int l, int r, int L, int R) {
  pushdown(o, l, r);
  if (l >= L && r <= R) return sum[o];
  int mid = (l + r) >> 1;
  int ans = 0;
  if (mid >= L) ans += get(o << 1, l, mid, L, R);
  if (mid < R) ans += get(o << 1 | 1, mid + 1, r, L, R);
  return ans;
}
void dfs(int u) {
  lef[u] = tot;
  for (int i = 0; i < vec[u].size(); i++) {
    tot++;
    dfs(vec[u][i]);
  }
  rig[u] = tot;
}
int main() {
  memset((sum), (0), sizeof(sum));
  int n;
  scanf("%d", &n);
  for (int i = 2; i <= n; i++) {
    int fa;
    scanf("%d", &fa);
    vec[fa].push_back(i);
  }
  dfs(1);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1; i <= n; i++)
    if (a[i]) change(1, 1, n, lef[i], lef[i]);
  int m;
  scanf("%d", &m);
  while (m--) {
    char s[10];
    int o;
    scanf("%s%d", s, &o);
    if (s[0] == 'g')
      printf("%d\n", get(1, 1, n, lef[o], rig[o]));
    else {
      change(1, 1, n, lef[o], rig[o]);
      a[o] ^= 1;
    }
  }
  return 0;
}
