| 记录编号 | 213114 | 评测结果 | AAAAAAAAAAAAAAAAAAAA | 
    
        | 题目名称 | 2019.[NOI 2015]软件包管理器 | 最终得分 | 100 | 
    
        | 用户昵称 |  stdafx.h | 是否通过 | 通过 | 
    
        | 代码语言 | C++ | 运行时间 | 7.646 s | 
    
        | 提交时间 | 2015-12-10 11:50:30 | 内存使用 | 6.77 MiB | 
    
    
    
    		显示代码纯文本
		
		#define lson l,mid,t
#define rson mid+1,r,t|1
#define cson l,r,rt
#define MAXN 100010UL
#define MAXC 20UL
#include <cstdio>
#include <cstring>
struct Edge{int v,nx;};
Edge edge[MAXN];
int n,m,ec,posl,posr,update_val,headlist[MAXN],fa[MAXN],son[MAXN],size[MAXN],cnt,id[MAXN],top[MAXN],mark[MAXN<<2],tree[MAXN<<2],out_sta[MAXN];
char op[MAXC];
inline void Add_Edge(int u,int v){
	edge[++ec].v=v;
	edge[ec].nx=headlist[u];
	headlist[u]=ec;
	return;
}
inline int in(){
	int x=0,c=getchar();
	while(c<'0'||c>'9') c=getchar();
	for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return x;
}
void dfs(int p){
	size[p]|=1;
	for(int i=headlist[p];i;i=edge[i].nx){
		dfs(edge[i].v);
		size[p]+=size[edge[i].v];
		if(size[son[p]]<size[edge[i].v]) son[p]=edge[i].v;
	}
	return;
}
void build_tree(int p,int tp){
	top[p]=tp;
	id[p]=++cnt;
	if(son[p]) build_tree(son[p],tp);
	for(int i=headlist[p];i;i=edge[i].nx)
		if(son[p]!=edge[i].v) build_tree(edge[i].v,edge[i].v);
	out_sta[p]=cnt;
	return;
}
inline void Clear(int l,int r,int rt){
	if(l==r||mark[rt]==-1) return;
	int t=rt<<1,mid=(l+r)>>1;
	mark[t]=mark[t|1]=mark[rt];
	tree[t]=mark[rt]*(mid-l+1);
	tree[t|1]=mark[rt]*(r-mid);
	mark[rt]=-1;
	return;
}
int Query(int l,int r,int rt){
	if(posl<=l&&posr>=r)
		return tree[rt];
	int t=rt<<1,mid=(l+r)>>1,Ans=0;
	Clear(cson);
	if(posl<=mid) Ans+=Query(lson);
	if(posr>mid) Ans+=Query(rson);
	return Ans;
}
void Update(int l,int r,int rt){
	if(posl<=l&&posr>=r){
		mark[rt]=update_val;
		tree[rt]=(r-l+1)*update_val;
		return;
	}
	int t=rt<<1,mid=(l+r)>>1;
	Clear(cson);
	if(posl<=mid) Update(lson);
	if(posr>mid) Update(rson);
	tree[rt]=tree[t]+tree[t|1]; 
	return;
}
inline int Q(int l,int r,int mk){
	if(l>r) return 0;
	posl=l,posr=r;
	if(mk) return r-l+1-Query(1,n,1); 
	else return Query(1,n,1);
}
inline void U(int l,int r,int ty){
	if(l>r) return;
	posl=l,posr=r,update_val=ty;
	Update(1,n,1);
	return;
}
inline void Install(int p){
	int Ans=0;
	while(top[p]!=1){
		Ans+=Q(id[top[p]],id[p],1);
		U(id[top[p]],id[p],1);
		p=fa[top[p]];
	}
	Ans+=Q(1,id[p],1);
	U(1,id[p],1);
	printf("%d",Ans);
	return;
}
inline void UnInstall(int p){
	printf("%d",Q(id[p],out_sta[p],0));
	U(id[p],out_sta[p],0);
	return;
}
int main(){
	freopen("manager.in","r",stdin);
	freopen("manager.out","w",stdout);
	n=in();
	memset(mark,-1,sizeof(mark));
	for(int i=2;i<=n;i++) fa[i]=in()+1,Add_Edge(fa[i],i);
	dfs(1);build_tree(1,1);
	scanf("%d",&m);
	for(int i=1,tmp;i<=m;i++,puts("")){
		scanf("%s",op),tmp=in()+1;
		if(op[0]=='i') Install(tmp);
		else UnInstall(tmp);
	}
	return 0;
}