#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
using namespace std;
inline int read(){
int x=0;short p=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') p=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return x*p;
}
const int N=1e5+5;
struct tree{
int l,r;
int sum;
int op;
}t[N<<2];
void build(int o,int l,int r){
t[o].l=l,t[o].r=r;
if(l==r) return ;
int mid=(l+r)>>1;
build(o<<1,l,mid);
build(o<<1|1,mid+1,r);
}
void pushup(int o){
t[o].sum=t[o<<1].sum+t[o<<1|1].sum;
}
void push(int o,int x){
t[o].sum=x>0?(t[o].r-t[o].l+1):0;
t[o].op=x;
}
void pushdown(int o){
if(!t[o].op) return ;
push(o<<1,t[o].op),push(o<<1|1,t[o].op);
t[o].op=0;
}
void change(int o,int ql,int qr,int x){
if(ql<=t[o].l&&t[o].r<=qr){
push(o,x);
return ;
}
pushdown(o);
int mid=(t[o].l+t[o].r)>>1;
if(ql<=mid) change(o<<1,ql,qr,x);
if(mid<qr) change(o<<1|1,ql,qr,x);
pushup(o);
}
int ask(int o,int ql,int qr){
if(ql<=t[o].l&&t[o].r<=qr) return t[o].sum;
pushdown(o);
int ans=0;
int mid=(t[o].l+t[o].r)>>1;
if(ql<=mid) ans+=ask(o<<1,ql,qr);
if(mid<qr) ans+=ask(o<<1|1,ql,qr);
pushup(o);
return ans;
}
#define build(l,r) build(1,l,r)
#define ask(ql,qr) ask(1,ql,qr)
#define change(ql,qr,x) change(1,ql,qr,x)
vector<int>e[N];
int fa[N],son[N];
int dep[N],siz[N];
void dfs1(int u,int fno){
fa[u]=fno;
siz[u]=1;
dep[u]=dep[fno]+1;
int t=-1;
for(auto v:e[u]){
if(v==fno) continue;
dfs1(v,u);
siz[u]+=siz[v];
if(siz[v]>t){
t=siz[v];
son[u]=v;
}
}
}
int id[N],cnt,top[N];
void dfs2(int u,int t){
top[u]=t;
id[u]=++cnt;
if(!son[u]) return ;
dfs2(son[u],u);
for(auto v:e[u]){
if(v==fa[u]||v==son[u]) continue;
dfs2(v,v);
}
}
int n,q;
void addPath(int u,int v){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
change(id[top[u]],id[u],1);
u=fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
change(id[u],id[v],1);
}
void MoveSon(int u){
change(id[u],id[u]+siz[u]-1,-1);
}
int main() {
freopen("P2146_2.in","r",stdin);
freopen("P2146_2.out","w",stdout);
n=read();
build(1,n);
for(int i=2;i<=n;i++){
int v=read();
v++;
e[i].push_back(v),e[v].push_back(i);
}
dfs1(1,0);
dfs2(1,1);
q=read();
while(q--){
string op;
cin>>op;
int u=read();
u++;
if(op=="install"){
int last=ask(1,n);
addPath(1,u);
printf("%d\n",ask(1,n)-last);
}
if(op=="uninstall"){
int last=ask(1,n);
MoveSon(u);
printf("%d\n",last-ask(1,n));
}
}
}