树剖卡死求助(以关注做回报)
查看原帖
树剖卡死求助(以关注做回报)
430409
Coros_Trusds楼主2021/8/28 19:59
//2021/8/27

//2021/8/28

#include <iostream>

#include <cstdio>

#include <algorithm>

#define debug(c) cerr<<#c<<" = "<<c<<endl

using namespace std;

const int ma=1000005;

struct Node
{
	int v;
	
	int nxt;
};

Node node[ma<<1];

int ans[ma<<2],t[ma<<2];
 
int head[ma],fa[ma],dep[ma],size[ma],son[ma],id[ma],top[ma];

int n,m;

int index,idx;

inline void add(int u,int v)
{
	node[++index].v=v;
	
	node[index].nxt=head[u];
	
	head[u]=index;
}

inline int ls(int p)
{
	return p<<1;
} 

inline int rs(int p)
{
	return p<<1|1;
}

inline void PushUp(int p)
{
	ans[p]=ans[ls(p)]+ans[rs(p)];
}

inline void Build(int p,int l,int r)
{
	t[p]=0;
	
	if(l==r)
	{
		ans[p]=0;
		
		return;
	}
	
	int mid=(l+r)>>1;
	
	Build(ls(p),l,mid);
	
	Build(rs(p),mid+1,r);
	
	PushUp(p);
}

inline void Lazy(int p,int l,int r,int k)
{
	ans[p]+=(r-l+1)*k;
	
	t[p]+=k;
}

inline void PushDown(int p,int l,int r)
{
	int mid=(l+r)>>1;
	
	Lazy(ls(p),l,mid,t[p]);
	
	Lazy(rs(p),mid+1,r,t[p]);
	
	t[p]=0;
} 

inline void updata(int nl,int nr,int l,int r,int p,int k)
{
	if(nl<=l && r<=nr)
	{
		Lazy(p,l,r,k);
		
		return;
	}
	
	int mid=(l+r)>>1;
	
	PushDown(p,l,r);
	
	if(mid<=nl)
	{
		updata(nl,nr,l,mid,ls(p),k);
	} 
	
	if(mid>nr)
	{
		updata(nl,nr,mid+1,r,rs(p),k);
	}
	
	PushUp(p);
}

inline int query(int nl,int nr,int l,int r,int p)
{
	if(nl<=l && r<=nr)
	{
		return ans[p];
	}
	
	int mid=(l+r)>>1;
	
	PushDown(p,l,r);
	
	int res=0;
	
	if(mid<=nl)
	{
		res+=query(nl,nr,l,mid,ls(p));
	}
	
	if(mid>nr)
	{
		res+=query(nl,nr,mid+1,r,rs(p)); 
	}
	
	return res;
}

inline void dfs1(int now,int fath,int depth)
{
	fa[now]=fath;
	
	dep[now]=depth;
	
	size[now]=1;
	
	int maxson=-1;
	
	for(register int i=head[now];i;i=node[i].nxt)
	{
		int v=node[i].v;
		
		if(v!=fath)
		{
			dfs1(v,now,depth+1);
			
			size[now]+=size[v];
			
			if(size[v]>maxson)
			{
				maxson=size[v];
				
				son[now]=v;
			}
		}
	}
} 

inline void dfs2(int now,int topf)
{
	id[now]=++idx;
	
	top[now]=topf;
	
	if(son[now]!=0)
	{
		dfs2(son[now],topf);
		
		for(register int i=head[now];i;i=node[i].nxt)
		{
			int v=node[i].v;
			
			if(v!=fa[now] && v!=son[now])
			{
				dfs2(v,v);
			}
		}
	}
}

inline void modify(int x,int y,int k)
{
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]])
		{
			swap(x,y);
		}
		
		updata(id[top[x]],id[x],1,n,1,k);
		
		x=fa[top[x]];
	}
	
	if(dep[x]>dep[y])
	{
		swap(x,y);
	}
	
	updata(id[x],id[y],1,n,1,k);
}
 
inline int Abs(int x)
{
	return x>0?x:-x; 
}
 
int main(void)
{
	scanf("%d",&n);
	
	for(register int i=2;i<=n;i++)
	{
		int x;
		
		scanf("%d",&x);
		
		x++;
		
		add(x,i);
		
		add(i,x);
	}
	
	dfs1(1,0,1);
	
	dfs2(1,1);
	
	Build(1,1,n);
	
	scanf("%d",&m);
	
	while(m--)
 	{
 		char opt[25];
 		
 		cin>>opt;
 		
 		int x;
 		
 		scanf("%d",&x);
 		
 		x++;
 		
 		int lst=ans[1];
 		
 		if(opt[0]=='i')
 		{
 			modify(1,x,1);
 			
 			printf("%d\n",Abs(ans[1]-lst));
		}
		
		else
		{
			updata(id[x],id[x]+size[x]-1,1,n,1,0);
			
			printf("%d\n",Abs(ans[1]-lst)); 
		}
	}
	
	return 0;
} 
2021/8/28 19:59
加载中...