#include <bits/stdc++.h>
using namespace std;
const int N = (int)1e6 + 123;
const long long INF = (long long)1e18 + 123;
const int inf = (int)1e9 + 123;
const int MOD = (int)1e9 + 7;
void megaRandom() {
  unsigned int FOR;
  asm("rdtsc" : "=A"(FOR));
  srand(FOR);
}
int n;
vector<int> g[N];
int type[N], timer, tin[N], tout[N];
char ch[6];
struct node {
  int ones, zeros, changed, to;
  node() { ones = zeros = changed = to = 0; }
} t[4 * N];
void push(int v, int tl, int tr) {
  if (!t[v].to) return;
  bool old = t[v].changed % 2;
  t[v].changed += t[v].to;
  if (t[v].changed % 2 != old) swap(t[v].ones, t[v].zeros);
  if (tl != tr) {
    t[(v << 1)].to += t[v].to;
    t[(v << 1) + 1].to += t[v].to;
  }
  t[v].to = 0;
}
void upd(int l, int r, int v = 1, int tl = 1, int tr = n) {
  push(v, tl, tr);
  if (l > r || tl > tr || tl > r || l > tr) return;
  if (l <= tl && tr <= r) {
    t[v].to++;
    push(v, tl, tr);
    return;
  }
  int mid = (tl + tr) >> 1;
  upd(l, r, (v << 1), tl, mid);
  upd(l, r, (v << 1) + 1, mid + 1, tr);
  t[v].ones = t[(v << 1)].ones + t[(v << 1) + 1].ones;
  t[v].zeros = t[(v << 1)].zeros + t[(v << 1) + 1].zeros;
}
int get(int l, int r, int v = 1, int tl = 1, int tr = n) {
  push(v, tl, tr);
  if (l > r || tl > tr || tl > r || l > tr) return 0;
  if (l <= tl && tr <= r) return t[v].ones;
  int mid = (tl + tr) >> 1;
  return get(l, r, (v << 1), tl, mid) + get(l, r, (v << 1) + 1, mid + 1, tr);
}
int origin[N];
void build(int v = 1, int tl = 1, int tr = n) {
  if (tl == tr) {
    t[v].ones = type[origin[tl]];
    t[v].zeros = (type[origin[tl]] ^ 1);
    return;
  }
  int mid = (tl + tr) >> 1;
  build((v << 1), tl, mid);
  build((v << 1) + 1, mid + 1, tr);
  t[v].ones = t[(v << 1)].ones + t[(v << 1) + 1].ones;
  t[v].zeros = t[(v << 1)].zeros + t[(v << 1) + 1].zeros;
}
void dfs(int x) {
  tin[x] = ++timer;
  origin[timer] = x;
  upd(timer, type[x]);
  for (auto to : g[x]) dfs(to);
  tout[x] = timer;
}
int main() {
  megaRandom();
  scanf("%d", &n);
  for (int i = 1, x; i < n; i++) {
    scanf("%d", &x);
    g[x].push_back(i + 1);
  }
  for (int i = 1; i <= n; i++) scanf("%d", &type[i]);
  dfs(1);
  build();
  int q;
  scanf("%d", &q);
  for (int i = 1, x; i <= q; i++) {
    scanf("%s%d", ch, &x);
    string tmp = ch;
    if (tmp == "get") {
      printf("%d\n", get(tin[x], tout[x]));
    }
    if (tmp == "pow") {
      upd(tin[x], tout[x]);
    }
  }
  return 0;
}
