#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, m;
int tot, tot1;
int head[N << 1], L[N], R[N];
struct xx {
  int to, nex;
} a[N << 1];
struct xxx {
  int l, r, v, tag;
} T[N << 2];
void Init() {
  tot = tot1 = 0;
  memset(head, -1, sizeof head);
}
void Add(int u, int v) { a[++tot].to = v, a[tot].nex = head[u], head[u] = tot; }
void Dfs(int k, int f) {
  tot1++;
  L[k] = tot1;
  for (int i = head[k]; i != -1; i = a[i].nex) {
    if (a[i].to == f) continue;
    Dfs(a[i].to, k);
  }
  R[k] = tot1;
}
void Pushdown(int k) {
  if (!T[k].tag) return;
  T[k << 1].tag ^= 1;
  T[k << 1 | 1].tag ^= 1;
  T[k << 1].v = T[k << 1].r - T[k << 1].l + 1 - T[k << 1].v;
  T[k << 1 | 1].v = T[k << 1 | 1].r - T[k << 1 | 1].l + 1 - T[k << 1 | 1].v;
  T[k].tag = 0;
}
void Pushup(int k) { T[k].v = T[k << 1].v + T[k << 1 | 1].v; }
void Build(int l, int r, int k) {
  T[k].l = l, T[k].r = r;
  T[k].v = T[k].tag = 0;
  if (l == r) return;
  int mid = (l + r) >> 1;
  Build(l, mid, k << 1);
  Build(mid + 1, r, k << 1 | 1);
  Pushup(k);
}
void Update(int l, int r, int k) {
  if (l <= T[k].l && r >= T[k].r) {
    T[k].tag ^= 1;
    T[k].v = T[k].r - T[k].l + 1 - T[k].v;
    return;
  }
  Pushdown(k);
  int mid = (T[k].l + T[k].r) >> 1;
  if (r <= mid)
    Update(l, r, k << 1);
  else if (l > mid)
    Update(l, r, k << 1 | 1);
  else {
    Update(l, mid, k << 1);
    Update(mid + 1, r, k << 1 | 1);
  }
  Pushup(k);
}
int ans;
void Query(int l, int r, int k) {
  if (l <= T[k].l && r >= T[k].r) {
    ans += T[k].v;
    return;
  }
  if (T[k].l == T[k].r) return;
  Pushdown(k);
  int mid = (T[k].l + T[k].r) >> 1;
  if (r <= mid)
    Query(l, r, k << 1);
  else if (l > mid)
    Query(l, r, k << 1 | 1);
  else {
    Query(l, mid, k << 1);
    Query(mid + 1, r, k << 1 | 1);
  }
}
int main() {
  while (scanf("%d", &n) == 1) {
    Init();
    int x;
    char op[5];
    for (int i = 2; i <= n; i++) {
      scanf("%d", &x);
      Add(x, i);
      Add(i, x);
    }
    Dfs(1, 0);
    Build(1, n, 1);
    printf("\n");
    for (int i = 1; i <= n; i++) {
      scanf("%d", &x);
      if (x) Update(L[i], L[i], 1);
    }
    scanf("%d", &m);
    while (m--) {
      scanf("%s%d", op, &x);
      if (op[0] == 'g') {
        ans = 0;
        Query(L[x], R[x], 1);
        printf("%d\n", ans);
      } else
        Update(L[x], R[x], 1);
    }
  }
}
