#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
const int maxm = 4e5 + 10;
const long long mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const double eps = 1e-5;
const double pi = acos(-1.0);
int tot, head[maxn], w[maxn], wt[maxn], n, m, r;
struct Edge {
  int to, next;
} edge[maxn << 1];
int a[maxn << 2], lazy[maxn << 2];
int son[maxn], id[maxn], fa[maxn], cnt, dep[maxn], siz[maxn], top[maxn];
int res = 0;
void add(int u, int v) {
  ++tot;
  edge[tot].to = v;
  edge[tot].next = head[u];
  head[u] = tot;
}
void push_down(int k, int l, int r) {
  a[k] = (r - l + 1) - a[k];
  if (l != r) {
    int cur = k << 1;
    lazy[cur] ^= 1;
    lazy[cur | 1] ^= 1;
  }
  lazy[k] = 0;
}
void build(int k, int l, int r) {
  if (l == r) {
    a[k] = wt[l];
    return;
  }
  build(k << 1, l, (l + r) >> 1);
  build((k << 1 | 1), ((l + r) >> 1) + 1, r);
  a[k] = (a[k << 1] + a[k << 1 | 1]);
}
void query(int k, int l, int r, int L, int R) {
  if (lazy[k]) push_down(k, l, r);
  if (r < L || R < l) return;
  if (L <= l && r <= R) {
    res += a[k];
    return;
  }
  int mid = (l + r) >> 1, cur = k << 1;
  query(cur, l, mid, L, R);
  query(cur | 1, mid + 1, r, L, R);
}
void update(int k, int l, int r, int L, int R) {
  if (lazy[k]) push_down(k, l, r);
  if (r < L || R < l) return;
  if (L <= l && r <= R) {
    push_down(k, l, r);
    return;
  }
  int mid = (l + r) >> 1, cur = k << 1;
  update(cur, l, mid, L, R);
  update(cur | 1, mid + 1, r, L, R);
  a[k] = a[cur] + a[cur | 1];
}
int qSon(int x) {
  res = 0;
  query(1, 1, n, id[x], id[x] + siz[x] - 1);
  return res;
}
void updSon(int x) { update(1, 1, n, id[x], id[x] + siz[x] - 1); }
void dfs1(int x, int f, int deep) {
  dep[x] = deep;
  fa[x] = f;
  siz[x] = 1;
  int maxson = -1;
  for (int i = head[x]; i; i = edge[i].next) {
    int y = edge[i].to;
    if (y == f) continue;
    dfs1(y, x, deep + 1);
    siz[x] += siz[y];
    if (siz[y] > maxson) son[x] = y, maxson = siz[y];
  }
}
void dfs2(int x, int topf) {
  id[x] = ++cnt;
  wt[id[x]] = w[x];
  top[x] = topf;
  if (!son[x]) return;
  dfs2(son[x], topf);
  for (int i = head[x]; i; i = edge[i].next) {
    int y = edge[i].to;
    if (y == fa[x] || y == son[x]) continue;
    dfs2(y, y);
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (int i = 2; i <= n; i++) {
    int x;
    cin >> x;
    add(i, x);
    add(x, i);
  }
  for (int i = 1; i <= n; i++) cin >> w[i];
  dfs1(1, 0, 1);
  dfs2(1, 1);
  build(1, 1, n);
  cin >> m;
  while (m--) {
    string s;
    int q;
    cin >> s >> q;
    if (s[0] == 'g') {
      qSon(q);
      cout << res << endl;
    } else
      updSon(q);
  }
  return ~~(0 - 0);
}
