线段树合并wa#1求调教
查看原帖
线段树合并wa#1求调教
754502
_AyachiNene楼主2023/12/6 15:56
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
	int f=1,res=0;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){res=(res<<1)+(res<<3)+(c^48);c=getchar();}
	return res*f;
}
void write(int x)
{
    if(x<0){putchar('-');x=-x;}
    if(x>9)write(x/10);
    putchar(x%10+'0');
}
struct node
{
	int nxt,to;
}e[114514<<1];
int head[114514],cnt_edge;
void add_edge(int u,int v)
{
	e[++cnt_edge].to=v;
	e[cnt_edge].nxt=head[u];
	head[u]=cnt_edge;
}
int n,m;
int dep[114514];
//---------SegmentTreeBegin---------
int rt[114514];
struct segt
{
	int ls,rs,val;
}t[114514<<6];
int cnt;
#define mid ((l+r)>>1)
void update(int root)
{
	t[root].val=t[t[root].ls].val+t[t[root].rs].val;
}
int insert(int x,int l,int r,int root)
{
	if(!root)
		root=++cnt;
	if(l==r)
	{
		++t[root].val;
		return root;
	}
	if(x<=mid)
		t[root].ls=insert(x,l,mid,t[root].ls);
	else
		t[root].rs=insert(x,mid+1,r,t[root].rs);
	update(root);
	return root;
}
int merge(int x,int y,int l,int r)
{
	if(!x||!y)
		return x|y;
	int cur=++cnt;
	if(l==r)
	{
		t[cur].val=t[x].val+t[y].val;
		return cur;
	}	
	t[cur].ls=merge(t[x].ls,t[y].ls,l,mid);
	t[cur].rs=merge(t[x].rs,t[y].rs,mid+1,r);
	update(cur);
	return cur;
}
int query(int x,int y,int l,int r,int root)
{
	if(!root)
		return 0;
	if(l>=x&&r<=y)
		return t[root].val;
	int res=0;
	if(x<=mid)
		res+=query(x,y,l,mid,t[root].ls);
	if(y>mid)
		res+=query(x,y,mid+1,r,t[root].rs);
	return res;
}
//---------SegmentTreeEnd-----------
void dfs1(int u,int fa)
{
	dep[u]=dep[fa]+1;
	for(int i=head[u];i;i=e[i].nxt)
	{
		int v=e[i].to;
		if(v==fa)
			continue;
		dfs1(v,u);
	}
}
void dfs2(int u,int fa)
{
	for(int i=head[u];i;i=e[i].nxt)
	{
		int v=e[i].to;
		if(v==fa)
			continue;
		dfs2(v,u);
		rt[u]=merge(rt[u],rt[v],1,1e5);
	}
}
int last=0;
int main()
{
	n=read(),m=read();
	for(int i=1;i<n;i++)
	{
		int u=read(),v=read();
		add_edge(u,v);
		add_edge(v,u);
	}
	dfs1(1,0);
	for(int i=1;i<=n;i++)
		rt[i]=insert(dep[i],1,1e5,rt[i]);
	dfs2(1,0);
	for(int i=1;i<=m;i++)
	{
		int op=read(),x=read();
		if(op==1)
			last=x;
		else
			write(query(last,1e5,1,1e5,rt[x])),puts("");
	}
}
2023/12/6 15:56
加载中...