#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 + 7;
const int MSIZE = 2e5 + 10;
const int INF = 1e9;
const int MAXMEMSET = 127;
vector<pair<int, int> > seg;
int timer = 0;
vector<vector<int> > g;
vector<int> id;
struct node {
  int val = 0;
  char add = 0;
};
int dfs(int v) {
  id[timer] = v;
  seg[v].first = seg[v].second = timer++;
  for (int to : g[v]) seg[v].second = dfs(to);
  return seg[v].second;
}
node t[MSIZE * 4];
void build(int a[], int v, int tl, int tr) {
  if (tl == tr)
    t[v].val = a[id[tl]];
  else {
    int tm = (tl + tr) / 2;
    build(a, v * 2, tl, tm);
    build(a, v * 2 + 1, tm + 1, tr);
    t[v].val = t[v * 2].val + t[v * 2 + 1].val;
  }
}
void push(int v, int tl, int tr) {
  if (t[v].add == 1) {
    int tm = (tl + tr) / 2;
    t[v * 2].val = tm - tl + 1 - t[v * 2].val;
    t[v * 2 + 1].val = tr - tm - t[v * 2 + 1].val;
    t[v * 2].add ^= 1;
    t[v * 2 + 1].add ^= 1;
    t[v].add = 0;
  }
}
void update(int v, int tl, int tr, int l, int r) {
  if (l > r) return;
  if (l == tl && tr == r) {
    t[v].val = tr - tl + 1 - t[v].val;
    t[v].add ^= 1;
  } else {
    push(v, tl, tr);
    int tm = (tl + tr) / 2;
    update(v * 2, tl, tm, l, min(r, tm));
    update(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r);
    t[v].val = t[v * 2].val + t[v * 2 + 1].val;
  }
}
int get(int v, int tl, int tr, int l, int r) {
  if (l > r) return 0;
  if (tl == l && tr == r) return t[v].val;
  push(v, tl, tr);
  int tm = (tl + tr) / 2;
  return get(v * 2, tl, tm, l, min(tm, r)) +
         get(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  int n;
  cin >> n;
  g.resize(n);
  seg.resize(n);
  id.resize(n);
  for (int i = 0; i < n - 1; ++i) {
    int p;
    cin >> p;
    g[p - 1].push_back(i + 1);
  }
  int a[MSIZE];
  for (int i = 0; i < n; ++i) cin >> a[i];
  dfs(0);
  build(a, 1, 0, n - 1);
  int q;
  cin >> q;
  for (int i = 0; i < q; ++i) {
    string s;
    int v;
    cin >> s >> v;
    v--;
    if (s[0] == 'g')
      cout << get(1, 0, n - 1, seg[v].first, seg[v].second) << '\n';
    else
      update(1, 0, n - 1, seg[v].first, seg[v].second);
  }
  return 0;
}
