#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, q, ticker = 1, color[N], euler[2 * N], tree[8 * N], add[8 * N];
vector<int> graph[N];
pair<int, int> entry[N];
void Dfs(int v, int parent) {
  entry[v].first = ticker;
  euler[ticker++] = color[v];
  for (int i = 0; i < graph[v].size(); i++) {
    int child = graph[v][i];
    if (child != parent) {
      Dfs(child, v);
    }
  }
  entry[v].second = ticker;
  euler[ticker++] = color[v];
}
void Build(int v, int vLeft, int vRight) {
  if (vLeft == vRight) {
    tree[v] = euler[vLeft];
    return;
  }
  int mid = (vLeft + vRight) / 2;
  Build(2 * v, vLeft, mid);
  Build(2 * v + 1, mid + 1, vRight);
  tree[v] = tree[2 * v] + tree[2 * v + 1];
}
void Push(int v, int vLeft, int vRight) {
  if (add[v] % 2 != 0) {
    tree[v] = (vRight - vLeft + 1) - tree[v];
  }
  if (vLeft != vRight) {
    add[2 * v] = add[2 * v] + add[v];
    add[2 * v + 1] = add[2 * v + 1] + add[v];
  }
  add[v] = 0;
}
int GetSum(int v, int vLeft, int vRight, int left, int right) {
  Push(v, vLeft, vRight);
  if (left > vRight || vLeft > right) {
    return 0;
  }
  if (vLeft >= left && right >= vRight) {
    return tree[v];
  }
  int mid = (vLeft + vRight) / 2;
  return GetSum(2 * v, vLeft, mid, left, right) +
         GetSum(2 * v + 1, mid + 1, vRight, left, right);
}
void Update(int v, int vLeft, int vRight, int left, int right) {
  Push(v, vLeft, vRight);
  if (left > vRight || vLeft > right) {
    return;
  }
  if (vLeft >= left && right >= vRight) {
    add[v]++;
    Push(v, vLeft, vRight);
    return;
  }
  tree[v] = 0;
  int mid = (vLeft + vRight) / 2;
  Update(2 * v, vLeft, mid, left, right);
  Update(2 * v + 1, mid + 1, vRight, left, right);
  tree[v] = tree[2 * v] + tree[2 * v + 1];
}
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n;
  for (int i = 2; i <= n; i++) {
    int from, to = i;
    cin >> from;
    graph[from].push_back(to);
    graph[to].push_back(from);
  }
  for (int i = 1; i <= n; i++) {
    cin >> color[i];
  }
  Dfs(1, -1);
  Build(1, 1, 2 * n);
  cin >> q;
  for (int i = 1; i <= q; i++) {
    string type;
    cin >> type;
    int vertex;
    cin >> vertex;
    if (type == "get") {
      cout << GetSum(1, 1, 2 * n, entry[vertex].first, entry[vertex].second) / 2
           << endl;
    } else {
      Update(1, 1, 2 * n, entry[vertex].first, entry[vertex].second);
    }
  }
}
