#include <bits/stdc++.h>
using namespace std;
vector<int> v[200005];
bool visit[200005];
int cnt = 0;
pair<int, int> arr[200005];
int order[200005];
int isOn[200005];
struct st {
  int prop;
  int sum;
} tree[4 * 200005];
void dfs(int node) {
  visit[node] = true;
  arr[node].first = ++cnt;
  order[cnt] = node;
  for (int i = 0; i < v[node].size(); i++) {
    int V = v[node][i];
    if (!visit[V]) {
      dfs(V);
    }
  }
  arr[node].second = cnt;
}
int make_tree(int node, int st, int ed) {
  if (st == ed) {
    tree[node].sum = isOn[order[st]];
    tree[node].prop = 0;
    return 0;
  }
  int mid = (st + ed) / 2;
  make_tree(2 * node, st, mid);
  make_tree(2 * node + 1, mid + 1, ed);
  tree[node].sum = tree[2 * node].sum + tree[2 * node + 1].sum;
}
void push_down(int node, int st, int ed) {
  if (tree[node].prop % 2) {
    int mid = (st + ed) / 2;
    tree[2 * node].prop += tree[node].prop;
    tree[2 * node + 1].prop += tree[node].prop;
    tree[node].prop = 0;
    tree[2 * node].sum = (mid - st + 1) - tree[2 * node].sum;
    tree[2 * node + 1].sum = (ed - mid) - tree[2 * node + 1].sum;
  }
}
int query(int node, int st, int ed, int i, int j) {
  if (i > ed || j < st) return 0;
  if (i <= st && j >= ed) {
    return tree[node].sum;
  }
  push_down(node, st, ed);
  int mid = (st + ed) / 2;
  int q = 0;
  q += query(2 * node, st, mid, i, j);
  q += query(2 * node + 1, mid + 1, ed, i, j);
  return q;
}
void update(int node, int st, int ed, int i, int j) {
  if (i > ed || j < st) return;
  if (st >= i && ed <= j) {
    tree[node].prop++;
    tree[node].sum = (ed - st + 1) - tree[node].sum;
    return;
  }
  push_down(node, st, ed);
  int mid = (st + ed) / 2;
  update(2 * node, st, mid, i, j);
  update(2 * node + 1, mid + 1, ed, i, j);
  tree[node].sum = tree[2 * node].sum + tree[2 * node + 1].sum;
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 2; i <= n; i++) {
    int parent;
    scanf("%d", &parent);
    v[parent].push_back(i);
  }
  for (int i = 1; i <= n; i++) scanf("%d", &isOn[i]);
  memset(visit, false, sizeof visit);
  dfs(1);
  make_tree(1, 1, n);
  int q;
  scanf("%d", &q);
  while (q--) {
    char s[10];
    scanf("%s", s);
    int sub_tree;
    scanf("%d", &sub_tree);
    if (s[0] == 'g')
      printf("%d\n", query(1, 1, n, arr[sub_tree].first, arr[sub_tree].second));
    else
      update(1, 1, n, arr[sub_tree].first, arr[sub_tree].second);
  }
  return 0;
}
