#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int a[maxn];
int n, q;
int dfn[maxn], in[maxn], ou[maxn];
int tot;
vector<int> E[maxn];
struct node {
  int l, r;
  long long sum, lazy;
  void update() {
    sum = 1ll * (r - l + 1) - sum;
    lazy ^= 1;
  }
};
node tree[maxn << 2];
void dfs(int u) {
  in[u] = ++tot;
  dfn[tot] = u;
  for (auto &v : E[u]) {
    dfs(v);
  }
  ou[u] = tot;
}
void push_up(int x) { tree[x].sum = tree[x << 1].sum + tree[x << 1 | 1].sum; }
void push_down(int x) {
  int lazyval = tree[x].lazy;
  if (lazyval) {
    tree[x << 1].update();
    tree[x << 1 | 1].update();
    tree[x].lazy = 0;
  }
}
void build(int x, int l, int r) {
  tree[x].l = l, tree[x].r = r;
  tree[x].sum = 0, tree[x].lazy = 0;
  if (l == r) {
    tree[x].sum = a[dfn[l]];
  } else {
    int mid = (l + r) / 2;
    build(x << 1, l, mid);
    build(x << 1 | 1, mid + 1, r);
    push_up(x);
  }
}
void update(int x, int l, int r) {
  int L = tree[x].l, R = tree[x].r;
  if (l <= L && R <= r) {
    tree[x].update();
  } else {
    push_down(x);
    int mid = (L + R) / 2;
    if (mid >= l) update(x << 1, l, r);
    if (r > mid) update(x << 1 | 1, l, r);
    push_up(x);
  }
}
long long query(int x, int l, int r) {
  int L = tree[x].l, R = tree[x].r;
  if (l <= L && R <= r) {
    return tree[x].sum;
  } else {
    push_down(x);
    int mid = (L + R) / 2;
    long long ans = 0;
    if (mid >= l) ans += query(x << 1, l, r);
    if (r > mid) ans += query(x << 1 | 1, l, r);
    return ans;
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n;
  for (int i = 2; i <= n; i++) {
    int x;
    cin >> x;
    E[x].push_back(i);
  }
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  dfs(1);
  build(1, 1, n);
  cin >> q;
  while (q--) {
    string s;
    cin >> s;
    int x;
    cin >> x;
    if (s[0] == 'g') {
      cout << query(1, in[x], ou[x]) << '\n';
    } else {
      update(1, in[x], ou[x]);
    }
  }
}
