#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N = 1e5 + 5;
struct Seg {
struct Node {
int v, tag;
} tr[N << 2];
void build(int k, int l, int r) {
tr[k].tag = -1;
if (l == r) return ;
int mid = (l + r) >> 1;
build(k << 1, l, mid);
build(k << 1 | 1, mid + 1, r);
}
inline void pushup(int k) {
tr[k].v = tr[k << 1].v + tr[k << 1 | 1].v;
}
inline void add(int k, int l, int r, int v) {
tr[k].v = (r - l + 1) * v;
tr[k].tag = v;
}
inline void pushdown(int k, int l, int r, int mid) {
if (tr[k].tag == -1) return ;
add(k << 1, l, mid, tr[k].tag);
add(k << 1 | 1, mid + 1, r, tr[k].tag);
tr[k].tag = -1;
}
inline void modify(int k, int l, int r, int L, int R, int v) {
if (l >= L && r <= R) return add(k, l, r, v);
int mid = (l + r) >> 1;
pushdown(k, l, r, mid);
if (mid >= L) modify(k << 1, l, mid, L, R, v);
if (mid < R) modify(k << 1 | 1, mid + 1, r, L, R, v);
pushup(k);
}
} T;
struct Edge {
int v, next;
} e[N << 1];
int n, fa[N], q;
string opt;
int head[N], cnt;
int siz[N], dep[N], son[N], top[N], dfn[N], idx;
inline void add(int u, int v) {
e[++cnt] = {v, head[u]};
head[u] = cnt;
}
void dfs1(int u) {
siz[u] = 1;
dep[u] = dep[fa[u]] + 1;
int mx = -1;
for (int i = head[u]; i; i = e[i].next) {
int v = e[i].v;
if (v == fa[u]) continue;
dfs1(v);
siz[u] += siz[v];
if (siz[v] > mx) {
mx = siz[v];
son[u] = v;
}
}
}
void dfs2(int u, int tp) {
top[u] = tp;
dfn[u] = ++idx;
if (!son[u]) return ;
dfs2(son[u], tp);
for (int i = head[u]; i; i = e[i].next) {
int v = e[i].v;
if (v == fa[u] || v == son[u]) continue;
dfs2(v, v);
}
}
void modify_range(int x, int y, int v) {
while (top[x] != top[y]) {
if (dep[top[x]] < dep[top[y]]) swap(x, y);
T.modify(1, 1, n, dfn[top[x]], dfn[x], v);
x = fa[top[x]];
}
if (dep[x] > dep[y]) swap(x, y);
T.modify(1, 1, n, dfn[x], dfn[y], v);
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n;
for (int i = 2; i <= n; i++) {
cin >> fa[i];
fa[i]++;
add(fa[i], i);
add(i, fa[i]);
}
dfs1(1);
dfs2(1, 1);
T.build(1, 1, n);
cin >> q;
while (q--) {
int x;
cin >> opt;
cin >> x;
int lst = T.tr[1].v;
if (opt[0] == 'i') {
modify_range(1, x, 1);
} else {
T.modify(1, 1, n, dfn[x], dfn[x] + siz[x] - 1, 0);
}
cout << abs(lst - T.tr[1].v) << endl;
}
return 0;
}