#include <bits/stdc++.h>
using namespace std;
vector<int>E[100001];
struct SegTree
{
int Left,Right,Sum,Tag;
}Tree[400001];
int n,T;
int fa[100001],dep[100001],son[100001],siz[100001];
int cnt,id[100001],top[100001];
void push_up(int k)
{
Tree[k].Sum=Tree[2*k].Sum+Tree[2*k+1].Sum;
}
void push_down(int k)
{
if(Tree[k].Tag==-1) return;
int l=Tree[k].Left,r=Tree[k].Right;
int mid=(l+r)/2;
Tree[2*k].Sum=(mid-l+1)*Tree[k].Tag;
Tree[2*k+1].Sum=(r-mid)*Tree[k].Tag;
Tree[2*k].Tag=Tree[2*k+1].Tag=Tree[k].Tag;
Tree[k].Tag=-1;
}
void Build(int k,int l,int r)
{
Tree[k].Left=l;
Tree[k].Right=r;
Tree[k].Tag=-1;
if(l==r)
{
Tree[k].Sum=0;
return;
}
int mid=(l+r)/2;
Build(2*k,l,mid);
Build(2*k+1,mid+1,r);
push_up(k);
}
int Query(int k,int l,int r)
{
if(Tree[k].Left>r||Tree[k].Right<l)
return 0;
if(Tree[k].Left>=l&&Tree[k].Right<=r)
return Tree[k].Sum;
push_down(k);
return Query(2*k,l,r)+Query(2*k+1,l,r);
}
void Update(int k,int l,int r,int num)
{
if(Tree[k].Left>r||Tree[k].Right<l)
return;
if(Tree[k].Left>=l&&Tree[k].Right<=r)
{
Tree[k].Sum=(Tree[k].Right-Tree[k].Left+1)*num;
Tree[k].Tag=num;
return;
}
push_down(k);
Update(2*k,l,r,num);
Update(2*k+1,l,r,num);
push_up(k);
}
//以上是线段树部分
void Dfs1(int u,int f)
{
fa[u]=f;
dep[u]=dep[f]+1;
siz[u]=1;
int maxn=-1;
for(int i=0;i<E[u].size();i++)
{
int v=E[u][i];
if(v==f) continue;
Dfs1(v,u);
siz[u]+=siz[v];
if(siz[v]>maxn)
{
maxn=siz[v];
son[u]=v;
}
}
}
void Dfs2(int u,int topf)
{
id[u]=++cnt;
top[u]=topf;
if(son[u]==-1) return;
Dfs2(son[u],topf);
for(int i=0;i<E[u].size();i++)
{
int v=E[u][i];
if(v==son[u]||v==fa[u]) continue;
Dfs2(v,v);
}
}
void UpdateI(int x,int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])
swap(x,y);
Update(1,id[top[x]],id[x],1);
x=fa[top[x]];
}
if(dep[x]>dep[y])
swap(x,y);
Update(1,id[x],id[y],1);
}
int QueryI(int x,int y)
{
int ans=0;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])
swap(x,y);
ans+=Query(1,id[top[x]],id[top[y]]);
x=fa[top[x]];
}
if(dep[x]>dep[y])
swap(x,y);
ans+=Query(1,id[x],id[y]);
return ans;
}
int main()
{
//freopen("P2146.in","r",stdin);
//freopen("Output.out","w",stdout);
scanf("%d",&n);
memset(son,-1,sizeof(son));
for(int i=1;i<n;i++)
{
int u;
scanf("%d",&u);
E[u].push_back(i);
E[i].push_back(u);
}
Dfs1(0,0);
Dfs2(0,0);
Build(1,1,n);
scanf("%d",&T);
while(T--)
{
string opt;
int x;
cin>>opt;
scanf("%d",&x);
if(opt=="install")
{
printf("%d\n",dep[x]-QueryI(0,x));
UpdateI(0,x);
}
if(opt=="uninstall")
{
printf("%d\n",Query(1,id[x],id[x]+siz[x]-1));
Update(1,id[x],id[x]+siz[x]-1,0);
}
}
return 0;
}