#include <bits/stdc++.h>
using namespace std;
const int sz = 2e5 + 5;
int n, q, v, a[sz], arr[sz], Tree[sz * 3], Lazy[sz * 3], Time = 0;
vector<int> x[sz];
pair<int, int> Range[sz];
string s;
void dfs(int u, int par) {
  Range[u].first = ++Time;
  arr[Time] = u;
  for (auto i : x[u]) {
    if (i != par) {
      dfs(i, u);
    }
  }
  Range[u].second = Time;
}
void Propagate(int node, int b, int e) {
  if (Lazy[node]) {
    Tree[node] = (e - b + 1) - Tree[node];
    if (b != e) {
      Lazy[node * 2] ^= 1;
      Lazy[node * 2 + 1] ^= 1;
    }
    Lazy[node] = 0;
  }
}
void Build(int node, int b, int e) {
  if (b == e) {
    Tree[node] = a[arr[b]];
    return;
  }
  int mid = (b + e) / 2, left = node * 2, right = left + 1;
  Build(left, b, mid);
  Build(right, mid + 1, e);
  Tree[node] = Tree[left] + Tree[right];
}
void Update(int node, int b, int e, int i, int j) {
  Propagate(node, b, e);
  if (b > j || e < i) return;
  if (b >= i && e <= j) {
    Lazy[node] = 1;
    Propagate(node, b, e);
    return;
  }
  int mid = (b + e) / 2, left = node * 2, right = left + 1;
  Update(left, b, mid, i, j);
  Update(right, mid + 1, e, i, j);
  Tree[node] = Tree[left] + Tree[right];
}
int Query(int node, int b, int e, int i, int j) {
  Propagate(node, b, e);
  if (b > j || e < i) return 0;
  if (b >= i && e <= j) return Tree[node];
  int mid = (b + e) / 2, left = node * 2, right = left + 1;
  int p = Query(left, b, mid, i, j);
  int q = Query(right, mid + 1, e, i, j);
  return p + q;
}
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0);
  cin >> n;
  for (int i = 2; i <= n; i++) {
    cin >> v;
    x[v].push_back(i);
  }
  dfs(1, -1);
  for (int i = 1; i <= n; i++) cin >> a[i];
  Build(1, 1, n);
  cin >> q;
  while (q--) {
    cin >> s >> v;
    if (s == "pow")
      Update(1, 1, n, Range[v].first, Range[v].second);
    else
      cout << Query(1, 1, n, Range[v].first, Range[v].second) << "\n";
  }
  return 0;
}
