#include <iostream>
#include <cstdio>
#include <algorithm>
#define debug(c) cerr<<#c<<" = "<<c<<endl
using namespace std;
const int ma=1000005;
struct Node
{
int v;
int nxt;
};
Node node[ma<<1];
int ans[ma<<2],t[ma<<2];
int head[ma],fa[ma],dep[ma],size[ma],son[ma],id[ma],top[ma];
int n,m;
int index,idx;
inline void add(int u,int v)
{
node[++index].v=v;
node[index].nxt=head[u];
head[u]=index;
}
inline int ls(int p)
{
return p<<1;
}
inline int rs(int p)
{
return p<<1|1;
}
inline void PushUp(int p)
{
ans[p]=ans[ls(p)]+ans[rs(p)];
}
inline void Build(int p,int l,int r)
{
t[p]=0;
if(l==r)
{
ans[p]=0;
return;
}
int mid=(l+r)>>1;
Build(ls(p),l,mid);
Build(rs(p),mid+1,r);
PushUp(p);
}
inline void Lazy(int p,int l,int r,int k)
{
ans[p]+=(r-l+1)*k;
t[p]+=k;
}
inline void PushDown(int p,int l,int r)
{
int mid=(l+r)>>1;
Lazy(ls(p),l,mid,t[p]);
Lazy(rs(p),mid+1,r,t[p]);
t[p]=0;
}
inline void updata(int nl,int nr,int l,int r,int p,int k)
{
if(nl<=l && r<=nr)
{
Lazy(p,l,r,k);
return;
}
int mid=(l+r)>>1;
PushDown(p,l,r);
if(mid<=nl)
{
updata(nl,nr,l,mid,ls(p),k);
}
if(mid>nr)
{
updata(nl,nr,mid+1,r,rs(p),k);
}
PushUp(p);
}
inline int query(int nl,int nr,int l,int r,int p)
{
if(nl<=l && r<=nr)
{
return ans[p];
}
int mid=(l+r)>>1;
PushDown(p,l,r);
int res=0;
if(mid<=nl)
{
res+=query(nl,nr,l,mid,ls(p));
}
if(mid>nr)
{
res+=query(nl,nr,mid+1,r,rs(p));
}
return res;
}
inline void dfs1(int now,int fath,int depth)
{
fa[now]=fath;
dep[now]=depth;
size[now]=1;
int maxson=-1;
for(register int i=head[now];i;i=node[i].nxt)
{
int v=node[i].v;
if(v!=fath)
{
dfs1(v,now,depth+1);
size[now]+=size[v];
if(size[v]>maxson)
{
maxson=size[v];
son[now]=v;
}
}
}
}
inline void dfs2(int now,int topf)
{
id[now]=++idx;
top[now]=topf;
if(son[now]!=0)
{
dfs2(son[now],topf);
for(register int i=head[now];i;i=node[i].nxt)
{
int v=node[i].v;
if(v!=fa[now] && v!=son[now])
{
dfs2(v,v);
}
}
}
}
inline void modify(int x,int y,int k)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])
{
swap(x,y);
}
updata(id[top[x]],id[x],1,n,1,k);
x=fa[top[x]];
}
if(dep[x]>dep[y])
{
swap(x,y);
}
updata(id[x],id[y],1,n,1,k);
}
inline int Abs(int x)
{
return x>0?x:-x;
}
int main(void)
{
scanf("%d",&n);
for(register int i=2;i<=n;i++)
{
int x;
scanf("%d",&x);
x++;
add(x,i);
add(i,x);
}
dfs1(1,0,1);
dfs2(1,1);
Build(1,1,n);
scanf("%d",&m);
while(m--)
{
char opt[25];
cin>>opt;
int x;
scanf("%d",&x);
x++;
int lst=ans[1];
if(opt[0]=='i')
{
modify(1,x,1);
printf("%d\n",Abs(ans[1]-lst));
}
else
{
updata(id[x],id[x]+size[x]-1,1,n,1,0);
printf("%d\n",Abs(ans[1]-lst));
}
}
return 0;
}