P2146 [NOI2015]软件包管理器 程序卡死了。。。。。。
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define re register
const int maxsize=400010;
int cnt,num,n,m;
int head[maxsize],lazy[maxsize],tr[maxsize],dep[maxsize];
int father[maxsize],son[maxsize],size[maxsize],id[maxsize],top[maxsize];
char s[21];
il int read()
{
int w=0,x=0;char ch=0;
while(!isdigit(ch)) w|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return w?-x:x;
}
il void write(int x)
{
if(x>9) write(x/10);
if(x<0) x=-x,putchar('-');
putchar(x%10+'0');
}
struct edge
{
int to,nxt;
}e[maxsize];
il void add(int u,int v)
{
e[++cnt].to=v;
e[cnt].nxt=head[u];
head[u]=cnt;
}
il void down(int x,int l,int r)
{
if(lazy[x]==-1) return;
lazy[x<<1]=lazy[x];lazy[x<<1|1]=lazy[x];
int mid=(l+r)>>1;
tr[x<<1]=(mid+1-l)*lazy[x];
tr[x<<1|1]=(r-mid)*lazy[x];
lazy[x]=-1;
}
il void dfs1(int x,int fax,int depx)
{
dep[x]=depx;father[x]=fax;size[x]=1;
for(re int i=head[x];i;i=e[i].nxt)
{
int v=e[i].to;
if(v==fax) continue;
dfs1(v,x,depx+1);
size[x]+=size[v];
if(size[v]>size[son[x]]) son[x]=v;
}
}
il void dfs2(int x,int t)
{
top[x]=t;id[x]=++num;
if(son[x]) dfs2(son[x],t);
for(re int i=head[x];i;i=e[i].nxt){int v=e[i].to;if(v==father[x]||v==son[x])continue; dfs2(v,v);}
}
il void build(int x,int l,int r)
{
if(l==r) {tr[x]=0;return;}
int mid=(l+r)>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
tr[x]=tr[x<<1]+tr[x<<1|1];
}
il void change(int x,int lnow,int rnow,int lwant,int rwant,int w)
{
if(lwant<=lnow&&rwant>=rnow) {lazy[x]=w;tr[x]=w*(rnow-lnow+1);return;}
down(x,lnow,rnow);
int mid=(lnow+rnow)>>1;
if(lwant<=mid) change(x<<1,lnow,rnow,lwant,rwant,w);
if(rwant>mid) change(x<<1|1,lnow,rnow,lwant,rwant,w);
tr[x]=tr[x<<1]+tr[x<<1|1];
}
il void edgechange(int x,int y,int w)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
change(1,1,n,id[top[x]],id[x],1);
x=father[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
change(1,1,n,id[x],id[y],1);
}
int main()
{
n=read();
for(re int i=2;i<=n;i++){int x=read()+1;add(x,i);}
dfs1(1,1,1);dfs2(1,0);build(1,1,n);
m=read();
for(re int i=1;i<m;i++)
{
scanf("%s",s+1);
int x=read()+1;
int temp=tr[1];
if(s[1]=='i'){edgechange(1,x,1);int t=tr[1];write(abs(temp-t)),puts(" ");}
if(s[1]=='u'){change(1,1,n,id[x],id[x]+size[x]-1,0);int t=tr[1];write(abs(temp-t));puts(" ");}
}
return 0;
}