#include<bits/stdc++.h>
using namespace std;
#define N 100005
int rd()
{
int x=0,y=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')y=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+(ch^48);ch=getchar();}
return x*y;
}
struct edge
{
int v,to;
}e[N];
int n,head[N],tot;
void add(int u,int v)
{
e[++tot].v=v;
e[tot].to=head[u];
head[u]=tot;
}
int dep[N],fa[N],son[N],sz[N],pre[N],id[N],dfn,top[N];
void dfs1(int u,int f,int dp)
{
fa[u]=f;
dep[u]=dp;
sz[u]=1;
for(int i=head[u];i!=-1;i=e[i].to)
{
int v=e[i].v;
dfs1(v,u,dp+1);
sz[u]+=sz[v];
if(son[u]==-1||sz[son[u]]<sz[v])son[u]=v;
}
}
void dfs2(int u,int tp)
{
//printf("%d\n",u);
id[u]=++dfn;
pre[dfn]=u;
top[u]=tp;
if(son[u]==-1)return;
dfs2(son[u],tp);
for(int i=head[u];i!=-1;i=e[i].to)
{
int v=e[i].v;
if(v!=son[u])dfs2(v,v);
}
}
int m,x;
string s;
struct tree
{
int l,r,sum,tag;
}t[N<<2];
int ls(int x){return x<<1;}
int rs(int x){return x<<1|1;}
int len(int x){return t[x].r-t[x].l+1;}
void pushup(int x){t[x].sum=t[ls(x)].sum+t[rs(x)].sum;}
void pushdown(int x)
{
t[ls(x)].tag=t[rs(x)].tag=t[x].tag;
t[ls(x)].sum+=len(ls(x))*t[x].tag;
t[rs(x)].sum+=len(rs(x))*t[x].tag;
t[x].tag=-1;
}
void build(int x,int l,int r)
{
t[x].l=l;
t[x].r=r;
t[x].tag=-1;
if(l==r)return;
int mid=l+r>>1;
build(ls(x),l,mid);
build(rs(x),mid+1,r);
}
void upd(int x,int L,int R,int w)
{
int l=t[x].l,r=t[x].r;
//printf("%d %d %d %d\n",l,r,L,R);
t[x].sum=w;
if(L<=l&&r<=R)
{
t[x].sum=len(x)*w;
t[x].tag=w;
return;
}
if(t[x].tag!=-1)pushdown(x);
int mid=l+r>>1;
if(L<=mid)upd(ls(x),L,R,w);
if(R> mid)upd(rs(x),L,R,w);
pushup(x);
}
void Qupd(int u,int v,int w)
{
while(top[u]!=top[v])
{
if(dep[top[u]]<dep[top[v]])swap(u,v);
upd(1,id[top[u]],id[u],w);
u=fa[top[u]];
}
if(dep[u]>dep[v])swap(u,v);
upd(1,id[u],id[v],w);
}
int main()
{
memset(head,-1,sizeof head);
memset(son,-1,sizeof son);
n=rd();
for(int i=1,x;i<n;i++)
{
x=rd();
add(x,i);
}
dfs1(0,-1,1);
dfs2(0,0);
//for(int i=0;i<n;i++)printf("%d %d %d\n",fa[i],son[i],dep[i]);
//for(int i=0;i<n;i++)printf("%d %d %d\n",id[i],pre[i],top[id[i]]);
build(1,1,dfn);
m=rd();
while(m--)
{
int now=t[1].sum;
cin>>s;
x=rd();
if(s[0]=='i')Qupd(0,x,1);
else upd(1,id[x],id[x]+sz[x]-1,0);
int then=t[1].sum;
printf("%d\n",abs(now-then));
}
return 0;
}
为什么我每次求问树剖都没人来
跟第一篇题解似乎差不多,但我没有整体往后拖一位
第一个样例过了,但第二个炸了
求教