#include<bits/stdc++.h>
using namespace std;
const long long F=1000010;
const long long bg=1000000;
struct sl1{
long long l,r,siz,val,add=3;
}tre[F];
long long tot,n,cnt,m;
long long head[F],ver[F],nxt[F],fa[F],kin[F],mson[F],top[F],nid[F],d[F];
string aim;
void add(long long x,long long y){
ver[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
void spread(long long p){
if(tre[p].add!=-1){
long long p1=p*2;
long long p2=p*2+1;
tre[p1].val=tre[p].add*tre[p1].siz;
tre[p2].val=tre[p].add*tre[p2].siz;
tre[p1].add=tre[p].add;
tre[p2].add=tre[p].add;
tre[p].add=-1;
}
}
void dfs1(long long x,long long f,long long de){
long long opt=-1;
d[x]=de;
fa[x]=f;
kin[x]=1;
for(long long i=head[x];i;i=nxt[i]){
long long y=ver[i];
if(y==f){
continue;
}
dfs1(y,x,de+1);
kin[x]+=kin[y];
if(kin[y]>opt){
opt=kin[y];
mson[x]=y;
}
}
}
void dfs2(long long x,long long f){
nid[x]=++cnt;
top[x]=f;
if(!mson[x]){
return;
}
dfs2(mson[x],f);
for(long long i=head[x];i;i=nxt[i]){
long long y=ver[i];
if(y==fa[x]||y==mson[x]){
continue;
}
dfs2(y,y);
}
}
void build(long long p,long long l,long long r){
tre[p].l=l;
tre[p].r=r;
tre[p].siz=r-l+1;
tre[p].add=-1;
long long p1=p*2;
long long p2=p*2+1;
long long mid=(l+r)/2;
if(l==r){
tre[p].val=0;
return;
}
build(p1,l,mid);
build(p2,mid+1,r);
tre[p].val=tre[p1].val+tre[p2].val;
}
void have(long long p,long long l,long long r,long long ml){
long long p1=p*2;
long long p2=p*2+1;
long long mid=(tre[p].l+tre[p].r)/2;
if(l<=tre[p].l&&tre[p].r<=r){
tre[p].val=tre[p].siz*ml;
tre[p].add=ml;
return;
}
spread(p);
if(l<=mid){
have(p1,l,r,ml);
}
if(r>mid){
have(p2,l,r,ml);
}
tre[p].val=tre[p1].val+tre[p2].val;
return;
}
long long ask(long long p,long long l,long long r){
long long ans=0;
long long p1=p*2;
long long p2=p*2+1;
long long mid=(tre[p].l+tre[p].r)/2;
if(l<=tre[p].l&&tre[p].r<=r){
return tre[p].val;
}
spread(p);
if(l<=mid){
ans+=ask(p1,l,r);
}
if(r>mid){
ans+=ask(p2,l,r);
}
return ans;
}
long long getask(long long x,long long y){
long long ans=0;
if(top[x]!=top[y]){
if(d[top[x]]<d[top[y]]){
swap(x,y);
}
ans+=ask(1,nid[top[x]],nid[x]);
x=fa[top[x]];
}
if(d[x]>d[y]){
swap(x,y);
}
ans+=ask(1,nid[x],nid[y]);
return ans;
}
void change(long long x,long long y,long long ml){
while(top[x]!=top[y]){
if(d[top[x]]<d[top[y]]){
swap(x,y);
}
have(1,nid[top[x]],nid[x],ml);
x=fa[top[x]];
}
if(d[x]>d[y]){
swap(x,y);
}
have(1,nid[x],nid[y],ml);
}
int main(){
cin>>n;
for(long long i=1;i<=n-1;i++){
long long opt;
cin>>opt;
if(opt==0){
opt=bg;
}
add(i,opt);
add(opt,i);
}
dfs1(bg,0,1);
dfs2(bg,bg);
build(1,1,n);
cin>>m;
while(m--){
long long len,x1;
cin>>aim>>x1;
if(x1==0){
x1=bg;
}
if(aim[0]=='i'){
cout<<d[x1]-getask(x1,bg)<<endl;
change(x1,bg,1);
}
else{
cout<<ask(1,nid[x1],nid[x1]+kin[x1]-1)<<endl;
have(1,nid[x1],nid[x1]+kin[x1]-1,0);
}
}
return 0;
}