#include <bits/stdc++.h>
const int INF = 0x7fffffff;
using namespace std;
inline char nc() {
  static char buf[100000], *p1 = buf, *p2 = buf;
  if (p1 == p2) {
    p2 = (p1 = buf) + fread(buf, 1, 100000, stdin);
    if (p1 == p2) return EOF;
  }
  return *p1++;
}
inline int read() {
  int x = 0, f = 1;
  char CH = getchar();
  while (CH < '0' || CH > '9') {
    if (CH == '-') f = 0;
    CH = getchar();
  }
  while (CH >= '0' && CH <= '9') {
    x = (x << 3) + (x << 1) + (CH - 48);
    CH = getchar();
  }
  return f ? x : -x;
}
const int N = 300500;
const int M = N << 1;
int n, m, k, cnt, fir[N], fa[N], dfs_clock, dfn[N], chu[N], dfsx[N << 2], a[N],
    son[N], vis[N << 2];
struct edge {
  int to, nxt;
} e[M];
struct segtree {
  int siz, sum, flag, l, r;
  void rev() {
    flag ^= 1;
    sum = (r - l + 1) - sum;
  }
} tr[N << 2];
inline void AE(int u, int v) {
  e[++cnt].to = v;
  e[cnt].nxt = fir[u];
  fir[u] = cnt;
  e[++cnt].to = u;
  e[cnt].nxt = fir[v];
  fir[v] = cnt;
}
inline void dfs(int x) {
  dfn[x] = ++dfs_clock;
  dfsx[dfs_clock] = x;
  for (int i = fir[x]; i; i = e[i].nxt) {
    if (e[i].to != fa[x]) dfs(e[i].to);
  }
  chu[x] = dfs_clock;
}
inline void pushup(int k) {
  tr[k].sum = 0;
  if (vis[k << 1]) tr[k].sum += tr[k << 1].sum;
  if (vis[k << 1 | 1]) tr[k].sum += tr[k << 1 | 1].sum;
}
inline void pushdown(int k) {
  if (tr[k].flag) {
    tr[k].flag ^= 1;
    if (vis[k << 1]) tr[k << 1].rev();
    if (vis[k << 1 | 1]) tr[k << 1 | 1].rev();
  }
}
inline void build(int k, int l, int r) {
  tr[k].l = l, tr[k].r = r;
  vis[k] = 1;
  if (l == r) {
    tr[k].siz = 1;
    tr[k].sum = a[dfsx[l]];
    tr[k].flag = 0;
    return;
  }
  int mid = (l + r) >> 1;
  build(k << 1, l, mid);
  build(k << 1 | 1, mid + 1, r);
  tr[k].siz = tr[k << 1].siz + tr[k << 1 | 1].siz;
  tr[k].sum = tr[k << 1].sum + tr[k << 1 | 1].sum;
  pushup(k);
}
inline void modify(int k, int l, int r) {
  if (tr[k].r < l || tr[k].l > r) return;
  if (l <= tr[k].l && tr[k].r <= r) return tr[k].rev();
  pushdown(k);
  modify(k << 1, l, r), modify(k << 1 | 1, l, r);
  pushup(k);
}
inline int query(int k, int l, int r) {
  if (tr[k].r < l || tr[k].l > r) return 0;
  if (l <= tr[k].l && r >= tr[k].r) return tr[k].sum;
  pushdown(k);
  return query(k << 1, l, r) + query(k << 1 | 1, l, r);
}
int main() {
  n = read();
  for (int i = 2; i <= n; i++) fa[i] = read(), AE(fa[i], i);
  for (int i = 1; i <= n; i++) a[i] = read();
  dfs(1);
  build(1, dfn[1], chu[1]);
  int m = read();
  while (m--) {
    char s[50];
    scanf("%s", s + 1);
    int xx = read();
    if (s[1] == 'g')
      printf("%d\n", query(1, dfn[xx], chu[xx]));
    else
      modify(1, dfn[xx], chu[xx]);
  }
}
