#include <bits/stdc++.h>
using namespace std;
struct interval {
  int val, rem;
};
int n, a[200005];
interval it[4 * 200005];
void set_node(int s, int l, int r) {
  it[s].val = (r - l + 1) - it[s].val;
  it[s].rem++;
}
void trans(int s, int l, int r) {
  if (it[s].rem == 0) return;
  int mid = (l + r) / 2;
  if (it[s].rem % 2 != 0)
    set_node(2 * s, l, mid), set_node(2 * s + 1, mid + 1, r);
  it[s].rem = 0;
}
void update(int s, int l, int r, int u, int v) {
  if (r < u || v < l) return;
  if (u <= l && r <= v) {
    set_node(s, l, r);
    return;
  }
  trans(s, l, r);
  int mid = (l + r) / 2;
  update(2 * s, l, mid, u, v);
  update(2 * s + 1, mid + 1, r, u, v);
  it[s].val = it[2 * s].val + it[2 * s + 1].val;
}
int get(int s, int l, int r, int u, int v) {
  if (r < u || v < l) return 0;
  if (u <= l && r <= v) return it[s].val;
  trans(s, l, r);
  int mid = (l + r) / 2;
  return get(2 * s, l, mid, u, v) + get(2 * s + 1, mid + 1, r, u, v);
}
vector<int> ke[200005];
void add(int u, int v) {
  ke[u].push_back(v);
  ke[v].push_back(u);
}
void enter() {
  cin >> n;
  for (int i = 2; i <= n; i++) {
    int x;
    cin >> x;
    add(x, i);
  }
  for (int i = 1; i <= n; i++) cin >> a[i];
}
int f[200005], num[200005], cnt = 0, id[200005];
void dfs(int u, int p) {
  num[u] = ++cnt;
  id[cnt] = u;
  f[u] = 1;
  for (int i = 0; i < ke[u].size(); i++) {
    int v = ke[u][i];
    if (v != p) dfs(v, u), f[u] += f[v];
  }
}
void process() {
  dfs(1, -1);
  for (int i = 1; i <= n; i++)
    if (a[i] == 1) update(1, 1, n, num[i], num[i]);
  int q = 0;
  cin >> q;
  for (int i = 1; i <= q; i++) {
    string st;
    int x;
    cin >> st;
    cin >> x;
    if (st == "pow")
      update(1, 1, n, num[x], num[x] + f[x] - 1);
    else
      cout << get(1, 1, n, num[x], num[x] + f[x] - 1) << endl;
  }
}
int main() {
  enter();
  process();
  return 0;
}
