#pragma optizime O(3)
#include<bits/stdc++.h>
#define ls k<<1
#define rs k<<1|1
using namespace std;
const int maxn=1e5+5;
inline char gc(){
static char buf[1000000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
int res=0;
char ch=gc();
while(ch<'0'||ch>'9')
ch=gc();
while(ch>='0'&&ch<='9'){
res=(res<<1)+(res<<3)+(ch^'0');
ch=gc();
}
return res;
}
vector<int> G[maxn];
int n,q,tot,a[maxn],son[maxn],w[maxn],fa[maxn],dep[maxn],siz[maxn],first[maxn],dfn[maxn],num[maxn<<2],add[maxn<<2];
void dfs1(int u){
siz[u]=1;
for(int i=0,len=G[u].size();i^len;++i){
int v=G[u][i];
dep[v]=dep[u]+1;
fa[v]=u;
dfs1(v);
siz[u]+=siz[v];
if(siz[v]>siz[son[u]])
son[u]=v;
}
}
void dfs2(int u,int t){
dfn[u]=++tot;
first[u]=t;
if(son[u])
dfs2(son[u],t);
for(int i=0,len=G[u].size();i^len;++i){
int v=G[u][i];
if(v^son[u])
dfs2(v,v);
}
}
inline void pushdown(int k,int l,int r){
if(add[k]^2){
int mid=l+r>>1;
add[ls]=add[rs]=add[k];
num[ls]=add[k]*(mid-l+1);
num[rs]=add[k]*(r-mid);
add[k]=2;
}
}
void change(int k,int l,int r,int x,int y,int v){
if(x<=l&&r<=y){
num[k]=(r-l+1)*v;
add[k]=v;
return;
}
if(!v&&!add[k])
return;
pushdown(k,l,r);
int mid=l+r>>1;
if(x<=mid)
change(ls,l,mid,x,y,v);
if(mid<y)
change(rs,mid+1,r,x,y,v);
num[k]=num[ls]+num[rs];
}
int query(int k,int l,int r,int x,int y){
if(x<=l&&r<=y)
return num[k];
if(!num[k])
return 0;
pushdown(k,l,r);
int mid=l+r>>1,res=0;
if(x<=mid)
res+=query(ls,l,mid,x,y);
if(mid<y)
res+=query(rs,mid+1,r,x,y);
return res;
}
inline int ask(int x){
int sum=0,qwq=x;
while(first[x]^0){
sum+=query(1,1,n,dfn[first[x]],dfn[x]);
change(1,1,n,dfn[first[x]],dfn[x],1);
x=fa[first[x]];
}
sum+=query(1,1,n,1,dfn[x]);
change(1,1,n,1,dfn[x],1);
return dep[qwq]+1-sum;
}
static char buf[1000005];
int len = -1;
inline void flush() {
fwrite(buf, 1, len + 1, stdout);
len = -1;
}
inline void __PC(const char x) {
if (len == 1000000)
flush();
buf[++len] = x;
}
template <typename T>
inline void write(T x) {
if (x > 9)
write(x / 10);
__PC(x % 10 ^ 48);
}
int main(){
n=read();
for(int i=1,x;i^n;++i){
x=read();
G[x].push_back(i);
}
dfs1(0);
dfs2(0,0);
q=read();
for(int i=1;i<=(n<<2);++i)
add[i]=2;
while(q--){
char ch=gc();
while(ch<'a'||ch>'z')
ch=gc();
int x=read();
if(ch^'i'){
write(query(1,1,n,dfn[x],dfn[x]+siz[x]-1));
change(1,1,n,dfn[x],dfn[x]+siz[x]-1,0);
} else
write(ask(x));
__PC('\n');
}
flush();
return 0;
}