RT,样例错了
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+5;
int n,m,r,a[maxn],tree[maxn<<2],tree1[maxn<<2],lazytag[maxn<<2];
int zhong[maxn],size[maxn],ceng[maxn];
int tot=0,st[maxn<<2],to[maxn<<2],nx[maxn<<2],fa[maxn];
int son[maxn];
int dfsxu,id[maxn],top[maxn],rk[maxn];
void add(int u,int v){
to[++tot]=v;
nx[tot]=st[u];
st[u]=tot;
}
int ls(int p){
return p<<1;
}
int rs(int p){
return p<<1|1;
}
void push_up(int p){
tree[p]=tree[ls(p)]+tree[rs(p)];
}
void dfs(int now,int father){
int maxx=0;
size[now]=1;
for(int i=st[now];i;i=nx[i]){
int v=to[i];
// cout<<"%%% "<<now<<' '<<v<<endl;
// cout<<"fa="<<fa[now]<<endl;
if(father!=v){
fa[v]=now;
// cout<<"%%% "<<v<<' '<<fa[v]<<' '<<now<<endl;
ceng[v]=ceng[now]+1;
dfs(v,now);
size[now]+=size[v];
if(size[son[now]]<size[v]){
maxx=size[v];
son[now]=v;
}
}
}
return;
}
void dfs2(int now,int fokeyou){
dfsxu++;
id[now]=dfsxu;
rk[dfsxu]=now;
top[now]=fokeyou;
if(son[now])dfs2(son[now],fokeyou);
for(int i=st[now];i;i=nx[i]){
int v=to[i];
if(fa[now]!=v&&v!=son[now]){
dfs2(v,v);
}
}
return;
}
void build(int l,int r,int p){
if(l==r){
tree[p]=a[rk[l]];
return;
}
int mid=(l+r)>>1;
build(l,mid,ls(p));
build(mid+1,r,rs(p));
push_up(p);
}
void c(int l,int r,int p,int k){
tree[k]=p*(r-l+1);
lazytag[k]=p;
}
void push_down(int l,int r,int p,int k){
int mid=(l+r)>>1;
c(l,mid,p,ls(k));
c(mid+1,r,p,rs(k));
lazytag[k]=0;
}
void change(int l,int r,int fl,int fr,int p,int k){
if(l>=fl&&r<=fr){
tree[k]=p*(r-l+1);
lazytag[k]=p;
return ;
}
push_down(l,r,lazytag[k],k);
int mid=(l+r)/2;
if(fl<=mid)change(l,mid,fl,fr,p,ls(k));
if(fr>mid){
change(mid+1,r,fl,fr,p,rs(k));
}
push_up(k);
return ;
}
int findhe(int l,int r,int fl,int fr,int k){
if(l>=fl&&r<=fr){
return tree[k];
}
push_down(l,r,lazytag[k],k);
int mid=(l+r)>>1,ans=0;
if(fl<=mid)ans+=findhe(l,mid,fl,fr,ls(k));
if(fr>mid)ans+=findhe(mid+1,r,fl,fr,rs(k));
return ans;
}
inline int qRange(int x,int y){
int ans=0;
while(top[x]!=top[y]){
if(ceng[top[x]]<ceng[top[y]])swap(x,y);
ans+=findhe(1,n,id[top[x]],id[x],1);
x=fa[top[x]];
}
if(ceng[x]>ceng[y])swap(x,y);
ans+=findhe(1,n,id[x],id[y],1);
return ans;
}
inline void updRange(int x,int y,int k){
while(top[x]!=top[y]){
if(ceng[top[x]]<ceng[top[y]])swap(x,y);
change(1,n,id[top[x]],id[x],k,1);
x=fa[top[x]];
}
if(ceng[x]>ceng[y])swap(x,y);
change(1,n,id[x],id[y],k,1);
}
inline int qSon(int x){
return findhe(1,n,id[x],id[x]+size[x]-1,1);
}
inline void updSon(int x,int k){
change(1,n,id[x],id[x]+size[x]-1,k,1);
}
signed main(){
scanf("%d",&n);
int u,v;
for(int i=2;i<=n;i++){
scanf("%d",&u);
add(u+1,i);
add(i,u+1);
}
string k;
r=1;
ceng[r]=1;
fa[r]=r;
dfs(r,0);
dfs2(r,r);
build(1,n,1);
int l,r;
cin>>m;
for(int i=1;i<=m;i++){
cin>>k;
cin>>l;
l++;
int be=tree[1];
if(k[0]=='i'){
updRange(1,l,1);
// cout<<"$$$";
cout<<abs(tree[1]-be)<<endl;
}
else{
updSon(l,0);
cout<<abs(tree[1]-be)<<endl;
}
}
return 0;
}