#include <bits/stdc++.h>
using namespace std;
struct edge {
  int v, nex;
} e[500005];
struct tree {
  int l, r, num, tag;
} tr[500005];
int head[500005], a[500005], n, m, mod, r, op, x, y, cnt = 0, z;
int s[500005], son[500005], fa[500005], h[500005], top[500005], id[500005], idx,
    b[500005];
void add(int u, int v) {
  e[++cnt].v = v;
  e[cnt].nex = head[u];
  head[u] = cnt;
}
void dfs1(int u) {
  int i, v;
  h[u] = h[fa[u]] + 1;
  s[u] = 1;
  for (i = head[u]; i; i = e[i].nex) {
    v = e[i].v;
    if (fa[u] == v) continue;
    fa[v] = u;
    dfs1(v);
    s[u] += s[v];
    if (s[son[u]] < s[v]) son[u] = v;
  }
}
void dfs2(int u, int topp) {
  id[u] = ++idx;
  b[idx] = a[u];
  top[u] = topp;
  if (son[u]) dfs2(son[u], topp);
  int i, v;
  for (i = head[u]; i; i = e[i].nex) {
    v = e[i].v;
    if (v == fa[u] || v == son[u]) continue;
    dfs2(v, v);
  }
}
void push(int rt) {
  if (tr[rt].tag) {
    tr[rt * 2 + 1].tag = tr[rt * 2 + 1].tag ^ 1,
                tr[rt * 2].tag = tr[rt * 2].tag ^ 1;
    tr[rt * 2 + 1].num =
        tr[rt * 2 + 1].r - tr[rt * 2 + 1].l + 1 - tr[rt * 2 + 1].num;
    tr[rt * 2].num = tr[rt * 2].r - tr[rt * 2].l + 1 - tr[rt * 2].num;
  }
  tr[rt].tag = 0;
}
void build(int rt, int l, int r) {
  tr[rt].l = l;
  tr[rt].r = r;
  tr[rt].tag = 0;
  if (l == r) {
    tr[rt].num = b[l];
    return;
  }
  int mid = l + r >> 1;
  build(rt * 2, l, mid);
  build(rt * 2 + 1, mid + 1, r);
  tr[rt].num = tr[rt * 2].num + tr[rt * 2 + 1].num;
}
void change(int rt, int l, int r) {
  if (tr[rt].l > r || tr[rt].r < l) return;
  if (tr[rt].l >= l && tr[rt].r <= r) {
    tr[rt].num = tr[rt].r - tr[rt].l + 1 - tr[rt].num;
    tr[rt].tag = tr[rt].tag ^ 1;
    return;
  }
  push(rt);
  change(rt * 2, l, r);
  change(rt * 2 + 1, l, r);
  tr[rt].num = (tr[rt * 2].num + tr[rt * 2 + 1].num);
}
int query(int rt, int l, int r) {
  if (tr[rt].l > r || tr[rt].r < l) return 0;
  if (tr[rt].l >= l && tr[rt].r <= r) return tr[rt].num;
  push(rt);
  return query(rt * 2, l, r) + query(rt * 2 + 1, l, r);
}
int main() {
  int i;
  string c;
  cin >> n;
  for (i = 1; i < n; i++) {
    x = i + 1;
    cin >> y;
    add(x, y);
    add(y, x);
  }
  for (i = 1; i <= n; i++) cin >> a[i];
  dfs1(1);
  dfs2(1, 1);
  build(1, 1, n);
  cin >> m;
  for (i = 1; i <= m; i++) {
    cin >> c >> x;
    if (c == "pow") {
      change(1, id[x], id[x] + s[x] - 1);
    }
    if (c == "get") {
      cout << query(1, id[x], id[x] + s[x] - 1) << endl;
    }
  }
  return 0;
}
