#include<bits/stdc++.h>
using namespace std;
#define debug cout<<-1<<endl
const int maxn=1e5+5;
int n,t;
vector<int>q[maxn];
int id[maxn];
int fa[maxn],top[maxn],son[maxn],siz[maxn],dep[maxn];
string opt;
int ans[4*maxn],num,tag[4*maxn];
int cnt=0;
int T;
void dfs1(int p){
siz[p]=1;
dep[p]=dep[fa[p]]+1;
for(int i=0;i<q[p].size();i++){
int v=q[p][i];
if(v!=fa[p]){
fa[v]=p;
dfs1(v);
siz[p]+=siz[v];
if(siz[son[p]]<siz[v]){
v=son[p];
}
}
}
}
void dfs2(int p,int tp){
top[p]=tp;
id[p]=++cnt;
if(son[p]){
dfs2(son[p],tp);
}
for(int i=0;i<q[p].size();i++){
int v=q[p][i];
if(v!=fa[p]&&v!=son[p]){
dfs2(v,v);
}
}
}
inline int ls(int a){
return 2*a;
}
inline int rs(int a){
return 2*a+1;
}
inline void pushup(int a){
ans[a]=ans[ls(a)]+ans[rs(a)];
}
void build(int l,int r,int p){
tag[p]=-1;
if(l==r){
ans[p]=0;
return;
}
int mid=(l+r)/2;
build(l,mid,ls(p));
build(mid+1,r,rs(p));
pushup(p);
}
inline void f(int l,int r,int p,int k){
if(k==-1){
return;
}
else{
if(k==1){
ans[p]=r-l+1;
tag[p]=1;
}
else{
ans[p]=0;
tag[p]=0;
}
}
}
void pushdown(int l,int r,int p){
int mid=(l+r)/2;
f(l,mid,ls(p),tag[p]);
f(mid+1,r,rs(p),tag[p]);
tag[p]=-1;
}
void change(int nl,int nr,int l,int r,int p,int k){
if(nl<=l&&r<=nr){
if(k==1){
ans[p]=r-l+1;
tag[p]=1;
}
else{
ans[p]=0;
tag[p]=0;
}
return;
}
pushdown(l,r,p);
int mid=(l+r)/2;
if(mid>=nl){
change(nl,nr,l,mid,ls(p),k);
}
if(mid<nr){
change(nl,nr,mid+1,r,rs(p),k);
}
pushup(p);
}
int query(int nl,int nr,int l,int r,int p){
int ret=0;
if(nl<=l&&r<=nr){
return ans[p];
}
pushdown(l,r,p);
int mid=(l+r)/2;
if(mid>=nl){
ret+=query(nl,nr,l,mid,ls(p));
}
if(mid<nr){
ret+=query(nl,nr,mid+1,r,rs(p));
}
return ret;
}
void update(int x,int y,int k){
while(top[x]!=top[y]){
if(dep[x]<dep[y]){
swap(x,y);
}
change(id[top[x]],id[x],1,n,1,k);
x=fa[top[x]];
}
if(dep[x]<dep[y]){
swap(x,y);
}
change(id[y],id[x],1,n,1,k);
}
int sum(int x,int y){
int ret=0;
while(top[x]!=top[y]){
if(dep[x]<dep[y]){
swap(x,y);
}
ret+=query(id[top[x]],id[x],1,n,1);
x=fa[top[x]];
}
if(dep[x]<dep[y]){
swap(x,y);
}
return ret+query(id[y],id[x],1,n,1);
}
signed main(){
scanf("%d",&n);
for(int i=1;i<n;i++){
int vv=0;
scanf("%d",&vv);
q[i].push_back(vv);
q[vv].push_back(i);
}
dfs1(0);
dfs2(0,0);
build(1,n,1);
scanf("%d",&T);
while(T--){
int x=0;
cin>>opt;
scanf("%d",&x);
if(opt[0]=='i'){
num=sum(0,x);
update(0,x,1);
printf("%d\n",sum(0,x)-num);
}
else{
num=query(id[x],id[x]+siz[x]-1,1,n,1);
change(id[x],id[x]+siz[x]-1,1,n,1,0);
printf("%d\n",num-query(id[x],id[x]+siz[x]-1,1,n,1));
}
}
}