#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
const long long mod = 1e9 + 7;
const int INF = 1e9;
inline void rd(long long &x) {
  x = 0;
  char ch = getchar();
  bool flag = 0;
  while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
  if (ch == '-') flag = 1, ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10ll + ch - '0', ch = getchar();
  if (flag) x = -x;
  return;
}
inline void rd(int &x) {
  x = 0;
  char ch = getchar();
  bool flag = 0;
  while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
  if (ch == '-') flag = 1, ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  if (flag) x = -x;
  return;
}
inline char rch() {
  char c;
  while ((c = getchar()) != 'N' && c != 'E')
    ;
  return c;
}
int n, firs[N], nex[N], tot, to[N], a[N];
inline void add(int u, int v) {
  to[++tot] = v;
  nex[tot] = firs[u];
  firs[u] = tot;
}
int siz[N], dfn[N], tp[N], tat;
inline void dfs(int x) {
  dfn[x] = ++tat;
  tp[tat] = x;
  siz[x] = 1;
  for (int i = firs[x]; i; i = nex[i]) {
    int y = to[i];
    dfs(y);
    siz[x] += siz[y];
  }
}
int t[N << 2];
inline void built(int k, int l, int r) {
  if (l == r) {
    t[k] = a[tp[l]];
  } else {
    int mid = (l + r) >> 1;
    built(k << 1, l, mid);
    built(k << 1 | 1, mid + 1, r);
    t[k] = t[k << 1] + t[k << 1 | 1];
  }
}
int flag[N << 2];
inline void pd(int k, int l, int r) {
  if (!flag[k]) return;
  int mid = (l + r) >> 1;
  flag[k << 1] ^= 1;
  flag[k << 1 | 1] ^= 1;
  flag[k] = 0;
  t[k << 1] = (mid - l + 1) - t[k << 1];
  t[k << 1 | 1] = (r - mid) - t[k << 1 | 1];
}
inline void update(int k, int l, int r, int L, int R) {
  if (L <= l && r <= R) {
    t[k] = (r - l + 1) - t[k];
    flag[k] ^= 1;
  } else {
    pd(k, l, r);
    int mid = (l + r) >> 1;
    if (mid >= L) update(k << 1, l, mid, L, R);
    if (mid < R) update(k << 1 | 1, mid + 1, r, L, R);
    t[k] = t[k << 1] + t[k << 1 | 1];
  }
}
inline int query(int k, int l, int r, int L, int R) {
  if (L <= l && r <= R) {
    return t[k];
  } else {
    pd(k, l, r);
    int mid = (l + r) >> 1;
    int ans = 0;
    if (mid >= L) ans += query(k << 1, l, mid, L, R);
    if (mid < R) ans += query(k << 1 | 1, mid + 1, r, L, R);
    t[k] = t[k << 1] + t[k << 1 | 1];
    return ans;
  }
}
int main() {
  rd(n);
  for (int i = 1, x; i < n; ++i) {
    rd(x);
    add(x, i + 1);
  }
  for (int i = 1; i <= n; ++i) rd(a[i]);
  dfs(1);
  built(1, 1, tat);
  int q;
  rd(q);
  char s[5];
  int x;
  while (q--) {
    scanf("%s", s + 1);
    rd(x);
    if (s[1] == 'g') {
      printf("%d\n", query(1, 1, n, dfn[x], dfn[x] + siz[x] - 1));
    } else {
      update(1, 1, n, dfn[x], dfn[x] + siz[x] - 1);
    }
  }
  return 0;
}
