求求了,全tle
#include<iostream>
#include<stdio.h>
#include<math.h>
#define it register int
#define mid (l+r>>1)
#define ls (now<<1)
#define rs (now<<1|1)
using namespace std;
const int N=1e5+7;
int n,m,a;
struct edg{
int to,next;
}e[N<<1];
int head[N],cnt;
inline void add(int l,int r){
e[++cnt].to=r,e[cnt].next=head[l],head[l]=cnt;
}
int de[N],fa[N],son[N],size[N],idx[N],gr[N];
inline void dfs1(int now,int far,int deep){
de[now]=deep,size[now]=1,fa[now]=far;
int ma=0;
for(it i=head[now];i;i=e[i].next){
if(e[i].to==far) continue;
dfs1(e[i].to,now,deep+1);
if(size[e[i].to]>ma){
ma=size[e[i].to];
son[now]=e[i].to;
}
size[now]+=size[e[i].to];
}
}
inline void dfs2(int now,int gra){
gr[now]=gra,idx[now]=++cnt;
if(!son[now]) return;
dfs2(son[now],gra);
for(it i=head[now];i;i=e[i].next){
if(e[i].to==fa[now]||e[i].to==son[now]) continue;
dfs2(e[i].to,e[i].to);
}
}
char k[20];
struct tree{
int l,r,v,f;
}t[N<<2];
inline void build(int now,int l,int r){
t[now].l=l,t[now].r=r,t[now].f=-1;
if(l==r) return;
build(ls,l,mid),build(rs,mid+1,r);
}
inline void down(int now){
t[ls].v=(t[ls].r-t[ls].l+1);
t[rs].v=(t[rs].r-t[rs].l+1);
t[ls].f=t[rs].f=1;
t[now].f=-1;
}
inline void dd(int now){
t[ls].v=t[rs].v=0;
t[ls].f=t[rs].f=0;
t[now].f=-1;
}
inline void push(int now){
t[now].v=t[ls].v+t[rs].v;
}
inline void change(int now,int ll,int rr){
int l=t[now].l,r=t[now].r;
if(ll<=l&&rr>=r){
t[now].v=(r-l+1);
t[now].f=1;
return;
}
if(t[now].f==1) return;
else if(t[now].f==0) dd(now);
if(mid>=ll) change(ls,ll,rr);
if(mid<rr) change(rs,ll,rr);
push(now);
}
inline void lca(int now){
while(now!=0) {
change(1,idx[gr[now]],idx[now]),now=fa[gr[now]];
}
}
inline void erase(int now,int ll,int rr){
int l=t[now].l,r=t[now].r;
if(ll<=l&&rr>=r){
t[now].v=0;
t[now].f=0;
return;
}
if(t[now].f==1) down(now);
else if(t[now].f==0) return;
if(mid>=ll) erase(ls,ll,rr);
if(mid<rr) erase(rs,ll,rr);
push(now);
}
inline int read(){
int x=0,f=1;char ch=getchar();
for(;(ch<'0'||ch>'9');ch=getchar()) if(ch=='-') f=-1;
for(;(ch>='0'&&ch<='9');ch=getchar()) x=x*10+ch-'0';
return x*f;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n;
for(it i=2,l;i<=n;++i) cin>>l,add(i,l+1),add(l+1,i);
dfs1(1,0,1);
cnt=0;
dfs2(1,1);
cin>>m;
int pre=0;
build(1,1,n);
while(m--){
scanf("%s",k);
a=read();
if(k[0]=='i'){
lca(a+1);
cout<<abs(t[1].v-pre)<<endl;
pre=t[1].v;
}
else {
erase(1,idx[a+1],idx[a+1]+size[a+1]-1);
cout<<abs(t[1].v-pre)<<endl;
pre=t[1].v;
}
}
}```