#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 7;
const long long mod = 1e9 + 7;
int n, q, step = 0;
int st[maxn], en[maxn];
vector<int> g[maxn];
int a[maxn << 2], b[maxn << 2];
char s[7];
void dfs(int id) {
  st[id] = ++step;
  for (auto i : g[id]) {
    dfs(i);
  }
  en[id] = step;
}
void push_down(int id, int l, int r) {
  if (!b[id]) return;
  b[id] = 0;
  b[id << 1] ^= 1;
  b[id << 1 | 1] ^= 1;
  int m = (l + r) / 2;
  a[id << 1] = (m - l + 1 - a[id << 1]);
  a[id << 1 | 1] = (r - m - a[id << 1 | 1]);
}
void update(int l, int r, int ul, int ur, int id) {
  if (l >= ul && r <= ur) {
    a[id] = (r - l + 1 - a[id]);
    b[id] ^= 1;
    return;
  }
  push_down(id, l, r);
  int m = (l + r) / 2;
  if (ul <= m) update(l, m, ul, ur, id << 1);
  if (ur >= m + 1) update(m + 1, r, ul, ur, id << 1 | 1);
  a[id] = a[id << 1] + a[id << 1 | 1];
}
int query(int l, int r, int ql, int qr, int id) {
  if (l >= ql && r <= qr) {
    return a[id];
  }
  push_down(id, l, r);
  int ans = 0, m = (l + r) / 2;
  if (ql <= m) ans += (query(l, m, ql, qr, id << 1));
  if (qr >= m + 1) ans += (query(m + 1, r, ql, qr, id << 1 | 1));
  return ans;
}
int main() {
  scanf("%d", &n);
  for (int i = 2; i <= n; ++i) {
    int u;
    scanf("%d", &u);
    g[u].push_back(i);
  }
  dfs(1);
  for (int i = 1; i <= n; ++i) {
    int t;
    scanf("%d", &t);
    if (t) update(1, n, st[i], st[i], 1);
  }
  scanf("%d", &q);
  for (int i = 0; i < q; ++i) {
    int u;
    scanf("%s%d", s, &u);
    if (s[0] == 'g') {
      printf("%d\n", query(1, n, st[u], en[u], 1));
    } else
      update(1, n, st[u], en[u], 1);
  }
  return 0;
}
