#include <bits/stdc++.h>
struct dta {
  int val, lz;
  dta(int _val = 0, int _lz = 0) {
    val = _val;
    lz = _lz;
  }
};
using namespace std;
int n, par[200010], cur[200010], Q[200010], lf[200010], rg[200010], len, m;
dta P[4 * 200010];
vector<int> A[200010];
void dfs(int x) {
  if (A[x].empty()) {
    Q[++len] = cur[x];
    lf[x] = rg[x] = len;
    return;
  }
  int tmp = 1e9;
  for (int i = 0; i <= A[x].size() - 1; i++) {
    dfs(A[x][i]);
    tmp = min(tmp, lf[A[x][i]]);
  }
  Q[++len] = cur[x];
  lf[x] = tmp;
  rg[x] = len;
  return;
}
void build(int id, int l, int r) {
  if (l == r) {
    P[id] = dta(Q[l], 0);
    return;
  }
  build(id * 2, l, (l + r) / 2);
  build(id * 2 + 1, (l + r) / 2 + 1, r);
  P[id].lz = 0;
  P[id].val = P[id * 2].val + P[id * 2 + 1].val;
  return;
}
inline void lzupdate(int id, int l, int r) {
  if (!P[id].lz) return;
  P[id].lz = 0;
  if (l == r) return;
  int mid = (l + r) >> 1;
  P[id << 1].lz = (P[id << 1].lz ? 0 : 1);
  P[(id << 1) + 1].lz = (P[(id << 1) + 1].lz ? 0 : 1);
  P[id << 1].val = (mid - l - P[id << 1].val + 1);
  P[(id << 1) + 1].val = (r - mid - P[(id << 1) + 1].val);
}
int get(int id, int l, int r, int L, int R) {
  if (L <= l && R >= r) return P[id].val;
  if (r < L || l > R) return 0;
  lzupdate(id, l, r);
  return (get(id * 2, l, (l + r) / 2, L, R) +
          get(id * 2 + 1, (l + r) / 2 + 1, r, L, R));
}
void update(int id, int l, int r, int L, int R) {
  if (L <= l && R >= r) {
    P[id].lz = (P[id].lz ? 0 : 1);
    P[id].val = (r - l - P[id].val + 1);
    return;
  }
  if (r < L || l > R) return;
  lzupdate(id, l, r);
  update(id * 2, l, (l + r) / 2, L, R);
  update(id * 2 + 1, (l + r) / 2 + 1, r, L, R);
  P[id].val = P[id * 2].val + P[id * 2 + 1].val;
}
int main() {
  scanf("%d", &n);
  for (int i = 2; i <= n; i++) {
    int u;
    scanf("%d", &u);
    par[i] = u;
    A[u].push_back(i);
  }
  for (int i = 1; i <= n; i++) scanf("%d", &cur[i]);
  len = 0;
  dfs(1);
  build(1, 1, n);
  scanf("%d", &m);
  for (int i = 1; i <= m; i++) {
    getchar();
    char t = getchar();
    getchar();
    getchar();
    int u;
    scanf("%d", &u);
    if (t == 'g')
      printf("%d\n", get(1, 1, n, lf[u], rg[u]));
    else
      update(1, 1, n, lf[u], rg[u]);
  }
  return 0;
}
