#include<bits/stdc++.h>
#define lc p<<1
#define rc p<<1|1
#define rep(i,st,ed) for(int i=st;i<=ed;++i)
#define bl(u,i) for(int i=head[u];i;i=e[i].nxt)
#define en puts("")
#define LLM LONG_LONG_MAX
#define LLm LONG_LONG_MIN
#define pii pair<ll,ll>
typedef long long ll;
typedef double db;
using namespace std;
const ll INF=0x3f3f3f3f;
void read() {}
void OP() {}
void op() {}
template <typename T, typename... T2>
inline void read(T &_, T2 &... oth)
{
int __=0;
_=0;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
__=1;
ch=getchar();
}
while(isdigit(ch))
{
_=_*10+ch-48;
ch=getchar();
}
_=__?-_:_;
read(oth...);
}
template <typename T>
void Out(T _)
{
if(_<0)
{
putchar('-');
_=-_;
}
if(_>=10)
Out(_/10);
putchar(_%10+'0');
}
template <typename T, typename... T2>
inline void OP(T _, T2... oth)
{
Out(_);
putchar('\n');
OP(oth...);
}
template <typename T, typename... T2>
inline void op(T _, T2... oth)
{
Out(_);
putchar(' ');
op(oth...);
}
/*#################################*/
const ll N=2E5+10;
ll n,q,tot,timer;
ll head[N],dep[N],siz[N],father[N],son[N],dfsn[N],top[N],sum[4*N],tag[4*N];
struct Edge{
ll nxt,to,w;
}e[N];
void add_edge(ll u,ll v,ll w,int flag)
{
e[++tot]=(Edge){head[u],v,w};
head[u]=tot;
if(flag)
add_edge(v,u,w,0);
}
void dfs(ll u,ll fa)
{
dep[u]=dep[fa]+1;
siz[u]=1;
father[u]=fa;
bl(u,i)
{
ll v=e[i].to;
if(v==fa)
continue;
dfs(v,u);
if(siz[v]>siz[son[u]])
son[u]=v;
siz[u]+=siz[v];
}
}
void dfs_(ll u,ll tp)
{
dfsn[u]=++timer;
top[u]=tp;
if(!son[u])
return;
dfs_(son[u],tp);
bl(u,i)
{
ll v=e[i].to;
if(v==son[u] || v==father[u])
continue;
dfs_(v,v);
}
}
void update(ll p)
{
sum[p]=sum[lc]+sum[rc];
}
void push_down(ll p,ll l,ll r)
{
ll mid=(l+r)>>1;
tag[lc]=tag[p];
sum[lc]=tag[p]?(mid-l+1):0;
tag[rc]=tag[p];
sum[rc]=tag[p]?(r-mid):0;
tag[p]=-1;
}
void cover(ll p,ll l,ll r,ll al,ll ar,ll val)
{
if(al<=l && ar>=r)
{
tag[p]=val;
sum[p]=val?(r-l+1):0;
return;
}
ll mid=(l+r)>>1;
if(tag[p]!=-1)
push_down(p,l,r);
if(al<=mid)
cover(lc,l,mid,al,ar,val);
if(ar>mid)
cover(rc,mid+1,r,al,ar,val);
update(p);
}
ll query(ll p,ll l,ll r,ll al,ll ar)
{
if(al<=l && ar>=r)
return sum[p];
ll mid=(l+r)>>1,ret=0;
if(tag[p]!=-1)
push_down(p,l,r);
if(al<=mid)
ret+=query(lc,l,mid,al,ar);
if(ar>mid)
ret+=query(rc,mid+1,r,al,ar);
return ret;
}
void print()
{
rep(i,1,4*n)
{
op(sum[i],tag[i]);
en;
}
en;
}
int main()
{
read(n);
rep(i,1,4*n)
tag[i]=-1;
ll u;
rep(v,2,n)
{
read(u);
++u;
add_edge(u,v,0,0);
}
string s;
dfs(1,0);
dfs_(1,1);
// OP(dfsn[1237]);
read(q);
while(q--)
{
cin>>s;
read(u);
++u;
if(s=="install")
{
ll res=dep[u];
while(top[u])
{
res-=query(1,1,n,dfsn[top[u]],dfsn[u]);
cover(1,1,n,dfsn[top[u]],dfsn[u],1);
u=father[top[u]];
}
OP(res);
}
else
{
ll res=query(1,1,n,dfsn[u],dfsn[u]+siz[u]-1);
cover(1,1,n,dfsn[u],dfsn[u]+siz[u]-1,0);
OP(res);
}
}
}