#include <bits/stdc++.h>
using namespace std;
struct Tree {
  struct Node {
    int cnt[2];
    int inv;
    Node() : cnt{0, 0}, inv(1) {}
  };
  int S;
  vector<Node> nodes;
  void merge(int v) {
    for (int i = 0; i < 2; i++) {
      nodes[v].cnt[i] = nodes[2 * v].cnt[i] + nodes[2 * v + 1].cnt[i];
    }
  }
  Tree(const vector<int>& init) {
    S = 1;
    while (S < ((int)(init).size())) {
      S *= 2;
    }
    nodes.resize(2 * S);
    for (int i = 0; i < ((int)(init).size()); i++) {
      if (init[i] == 0) {
        nodes[i + S].cnt[0] = 1;
      } else {
        nodes[i + S].cnt[1] = 1;
      }
    }
    for (int i = S - 1; i > 0; i--) {
      merge(i);
    }
  }
  void inverse(int v) {
    nodes[v].inv *= -1;
    swap(nodes[v].cnt[0], nodes[v].cnt[1]);
  }
  void push(int v) {
    if (nodes[v].inv < 0) {
      inverse(2 * v);
      inverse(2 * v + 1);
      nodes[v].inv = 1;
    }
  }
  void change_rec(int a, int b, int v, int l, int r) {
    if (b < l || r < a) {
      return;
    }
    if (a <= l && r <= b) {
      inverse(v);
      return;
    }
    push(v);
    int mid = (l + r) / 2;
    change_rec(a, b, 2 * v, l, mid);
    change_rec(a, b, 2 * v + 1, mid + 1, r);
    merge(v);
  }
  void change(int a, int b) { change_rec(a, b, 1, 0, S - 1); }
  int query_rec(int a, int b, int v, int l, int r) {
    if (b < l || r < a) {
      return 0;
    }
    if (a <= l && r <= b) {
      return nodes[v].cnt[1];
    }
    push(v);
    int mid = (l + r) / 2;
    int res =
        query_rec(a, b, 2 * v, l, mid) + query_rec(a, b, 2 * v + 1, mid + 1, r);
    merge(v);
    return res;
  }
  int query(int a, int b) { return query_rec(a, b, 1, 0, S - 1); }
};
const int N = 200 * 1000 + 5;
vector<int> G[N];
int in[N], out[N];
int dfs(int v, int czas) {
  in[v] = ++czas;
  for (int u : G[v]) {
    if (in[u] == 0) {
      czas = dfs(u, czas);
    }
  }
  out[v] = czas;
  return czas;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int n;
  cin >> n;
  for (int i = 2; i <= n; i++) {
    int p;
    cin >> p;
    G[p].push_back(i);
  }
  dfs(1, 0);
  vector<int> init(n + 1);
  for (int i = 1; i <= n; i++) {
    int t;
    cin >> t;
    init[in[i]] = t;
  }
  Tree tree(init);
  int q;
  cin >> q;
  while (q--) {
    string s;
    int v;
    cin >> s >> v;
    int a = in[v];
    int b = out[v];
    if (s == "pow") {
      tree.change(a, b);
    } else {
      cout << tree.query(a, b) << "\n";
    }
  }
}
