#include <bits/stdc++.h>
using namespace std;
vector<int> graph[200005];
int data[200005], light[200005], tree[3 * 200005][2], lazy[3 * 200005];
int tour_b[200005], tour_e[200005], t, n;
void dfs(int n, int p) {
  tour_b[n] = ++t;
  light[t] = data[n];
  for (auto i : graph[n]) {
    if (i != p) {
      dfs(i, n);
    }
  }
  tour_e[n] = t;
}
void build(int n, int lo, int hi) {
  if (lo == hi) {
    if (light[lo] == 1) {
      tree[n][0] = 1;
      tree[n][1] = 0;
    } else {
      tree[n][0] = 0;
      tree[n][1] = 1;
    }
    return;
  }
  int mid = (lo + hi) / 2;
  build(n * 2, lo, mid);
  build(n * 2 + 1, mid + 1, hi);
  tree[n][0] = tree[n * 2][0] + tree[n * 2 + 1][0];
  tree[n][1] = tree[n * 2][1] + tree[n * 2 + 1][1];
}
void update(int n, int lo, int hi, int i, int j) {
  if (lazy[n] != 0) {
    if (lazy[n] & 1) {
      swap(tree[n][0], tree[n][1]);
    }
    if (lo != hi) {
      lazy[n * 2] += lazy[n];
      lazy[n * 2 + 1] += lazy[n];
    }
    lazy[n] = 0;
  }
  if (lo > hi || lo > j || hi < i) return;
  if (lo >= i && hi <= j) {
    swap(tree[n][0], tree[n][1]);
    if (lo != hi) {
      lazy[n * 2]++;
      lazy[n * 2 + 1]++;
    }
    return;
  }
  update(n * 2, lo, (lo + hi) / 2, i, j);
  update(n * 2 + 1, ((lo + hi) / 2) + 1, hi, i, j);
  tree[n][0] = tree[n * 2][0] + tree[n * 2 + 1][0];
  tree[n][1] = (tree[n * 2][1] + tree[n * 2 + 1][1]);
}
int query(int n, int lo, int hi, int i, int j) {
  if (lo > hi || lo > j || hi < i) return 0;
  if (lazy[n] != 0) {
    if (lazy[n] & 1) {
      swap(tree[n][0], tree[n][1]);
    }
    if (lo != hi) {
      lazy[n * 2] += lazy[n];
      lazy[n * 2 + 1] += lazy[n];
    }
    lazy[n] = 0;
  }
  if (lo >= i && hi <= j) return tree[n][0];
  int q1 = query(n * 2, lo, (lo + hi) / 2, i, j);
  int q2 = query(n * 2 + 1, ((lo + hi) / 2) + 1, hi, i, j);
  return (q1 + q2);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (int i = 2; i <= n; i++) {
    int p;
    cin >> p;
    graph[p].push_back(i);
  }
  for (int i = 1; i <= n; i++) cin >> data[i];
  dfs(1, 0);
  int q;
  cin >> q;
  build(1, 1, n);
  while (q--) {
    string s;
    int idx;
    cin >> s >> idx;
    if (s == "get") {
      cout << query(1, 1, n, tour_b[idx], tour_e[idx]) << '\n';
    } else {
      update(1, 1, n, tour_b[idx], tour_e[idx]);
    }
  }
  return 0;
}
