记录编号 |
213114 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[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;
}