#include<iostream>
using namespace std;
int read(){
int re=0;
char t=getchar();
while(t<'0'||t>'9')t=getchar();
while(t>='0'&&t<='9')re=re*10+(t^48),t=getchar();
return re;
}
void write(int x){
if(x<10)putchar(x+'0');
else write(x/10),putchar(x%10+'0');
}
void writeln(int x){
write(x);
putchar('\n');
}
int n,q;
int myabs(int x){return x>0?x:-x;}
struct EDGE{
int to,next;
}e[200005];
int head[100005],cntedge;
void addedge(int u,int v){
e[++cntedge].to=v;
e[cntedge].next=head[u];
head[u]=cntedge;
}
void daddedge(int u,int v){
addedge(u,v);
addedge(v,u);
}
struct NODE{
int size,h_son,fa,dep,id,top;
}nod[100005];
int cntid;
void dfs1(int f,int x){
nod[x].size=1;
nod[x].fa=f;
nod[x].dep=nod[f].dep+1;
for(int i=head[x];i;i=e[i].next){
if(e[i].to==f)continue;
dfs1(x,e[i].to);
nod[x].size+=nod[e[i].to].size;
if(nod[nod[x].h_son].size<nod[e[i].to].size){
nod[x].h_son=e[i].to;
}
}
}
void dfs2(int top,int x){
nod[x].top=top;
nod[x].id=++cntid;
if(nod[x].size==1)return;
dfs2(top,nod[x].h_son);
for(int i=head[x];i;i=e[i].next){
if(e[i].to==nod[x].fa||e[i].to==nod[x].h_son)continue;
dfs2(e[i].to,e[i].to);
}
}
#define mid ((l+r)>>1)
struct SEGTREE{
int a[100005<<2],t[100005<<2];
int ls(int x){return x<<1;}
int rs(int x){return x<<1|1;}
void update(int x){
a[x]=a[ls(x)]+a[rs(x)];
}
void build(int x,int l,int r){
if(l==r){
a[x]=0;
return;
}
build(ls(x),l,mid);
build(rs(x),mid+1,r);
update(x);
}
void add(int x,int l,int r,int k){
if(k==1){
a[x]=r-l+1;
t[x]=1;
}
else if(k==2){
a[x]=0;
t[x]=2;
}
}
void push_down(int x,int l,int r){
if(t[x]!=0){
add(ls(x),l,mid,t[x]);
add(rs(x),mid+1,r,t[x]);
t[x]=0;
}
}
void modify(int x,int l,int r,int ml,int mr,int k){
if(ml<=l&&r<=mr){
add(x,l,r,k);
return;
}
push_down(x,l,r);
if(ml<=mid)modify(ls(x),l,mid,ml,mr,k);
if(mr>mid)modify(rs(x),mid+1,r,ml,mr,k);
update(x);
}
int query(int x,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return a[x];
push_down(x,l,r);
int re=0;
if(ql<=mid)re+=query(ls(x),l,mid,ql,qr);
if(qr>mid)re+=query(rs(x),mid+1,r,ql,qr);
update(x);
return re;
}
}T;
#ifdef mid
#undef mid
#endif
int query(int x){
int re=0;
while(nod[x].top!=1){
re+=T.query(1,1,n,nod[nod[x].top].id,nod[x].id);
x=nod[nod[x].top].fa;
}
re+=T.query(1,1,n,nod[1].id,nod[x].id);
return re;
}
void modify(int x,int k){
while(nod[x].top!=1){
T.modify(1,1,n,nod[nod[x].top].id,nod[x].id,1);
x=nod[nod[x].top].fa;
}
T.modify(1,1,n,nod[1].id,nod[x].id,1);
}
int install(int x){
x+=1;
int a=query(x);
modify(x,1);
int b=query(x);
return myabs(a-b);
}
int uninstall(int x){
x+=1;
int a=T.query(1,1,n,nod[x].id,nod[x].id+nod[x].size-1);
T.modify(1,1,n,nod[x].id,nod[x].id+nod[x].size-1,2);
int b=T.query(1,1,n,nod[x].id,nod[x].id+nod[x].size-1);
return myabs(a-b);
}
int main(){
n=read();
for(int i=2;i<=n;i++){
int t=read();
t++;
daddedge(i,t);
}
dfs1(0,1);
dfs2(1,1);
T.build(1,1,n);
q=read();
for(int i=1;i<=q;i++){
char t=getchar();
if(t=='i'){
int x=read();
writeln(install(x));
}
else{
int x=read();
writeln(uninstall(x));
}
}
return 0;
}