#include<bits/stdc++.h>
using namespace std;
const int maxn=10*114514;
struct Edge{
int to;
int nxt;
}edge[maxn];
struct segment_tree{
int l;
int r;
int tag;
int num;
}tree[4*maxn];
int head[maxn];
int idx;
int n,q;
void add(int u,int v){
idx++;
edge[idx].to=v;
edge[idx].nxt=head[u];
head[u]=idx;
}
int dep[maxn];
int son[maxn];
int fa[maxn];
int rank_[maxn];
int time_stamp=-1;
int dfn[maxn];
int siz[maxn];
int top[maxn];
void dfs1(int u,int fa_){
int max_siz=0;
if(u!=0) dep[u]=dep[fa_]+1;
siz[u]=1;
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].to;
dfs1(v,u);
siz[u]+=siz[v];
if(siz[v]>=max_siz){
max_siz=siz[v];
son[u]=v;
}
}
}
void dfs2(int u,int top_){
top[u]=top_;
time_stamp++;
dfn[u]=time_stamp;
if(son[u]) dfs2(son[u],top_);
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].to;
if(v==son[u]) continue;
dfs2(v,v);
}
return;
}
int length_(int id){
return tree[id].r-tree[id].l+1;
}
void pushup(int id){
tree[id].num=tree[id*2].num+tree[id*2+1].num;
}
void pushdown(int id){
if(tree[id].tag==1){
tree[id*2].tag=1;
tree[id*2].num=length_(id*2);
tree[id*2+1].tag=1;
tree[id*2+1].num=length_(id*2+1);
tree[id].tag=0;
}
if(tree[id].tag==2){
tree[id*2].tag=2;
tree[id*2].num=0;
tree[id*2+1].tag=2;
tree[id*2+1].num=0;
tree[id].tag=0;
}
return;
}
void build(int id,int l,int r){
tree[id].l=l;
tree[id].r=r;
if(l==r){
tree[id].num=0;
return;
}
int mid=l+r>>1;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
pushup(id);
}
void modify(int id,int l,int r,int f){
int l1=tree[id].l;
int r1=tree[id].r;
if(l1>=l&&r1<=r){
tree[id].tag=f;
tree[id].num=(f%2)*length_(id);
return;
}
if(r<l1) return;
if(l>r1) return;
if(l1!=r1) pushdown(id);
int mid=l1+r1>>1;
if(l<=mid) modify(id*2,l,r,f);
if(r>mid) modify(id*2+1,l,r,f);
pushup(id);
}
void modify1(int x,int y,bool f){
while(top[x]!=top[y]){
int x_=top[x];
int y_=top[y];
if(dep[x]<dep[y]){
swap(x,y);
swap(x_,y_);
}
modify(1,dfn[x_],dfn[x],f);
x=fa[x_];
}
if(dep[x]>dep[y]){
swap(x,y);
}
modify(1,dfn[x],dfn[y],f);
return;
}
void modify2(int x,int f){
int x_=rank_[x]+siz[x]-1;
modify(1,rank_[x],x_,f);
return;
}
int query(int id,int l,int r){
int l1=tree[id].l;
int r1=tree[id].r;
if(l1>=l&&r1<=r){
return tree[id].num;
}
if(l1!=r1) pushdown(id);
int mid=l1+r1>>1;
int ans=0;
if(l<=mid) ans+=query(id*2,l,r);
if(r>mid) ans+=query(id*2+1,l,r);
pushup(id);
return ans;
}
int last_ans=0;
int main(){
scanf("%d",&n);
fa[0]=-1;
for(int i=1;i<n;i++){
int v;
scanf("%d",&v);
add(v,i);
fa[i]=v;
}
dep[0]=1;
dfs1(0,-1);
dfs2(0,0);
for(int i=0;i<n;i++){
rank_[dfn[i]]=i;
}
build(1,0,n-1);
scanf("%d",&q);
while(q--){
char s[105];
scanf("%s",s);
switch(s[0]){
case 'i':{
int x;
scanf("%d",&x);
modify1(0,x,1);
break;
}
default:{
int x;
scanf("%d",&x);
modify2(x,2);
break;
}
}
int now=query(1,0,n-1);
printf("%d\n",abs(now-last_ans));
last_ans=now;
}
return 0;
}