萌新求助splay $84$ 分
查看原帖
萌新求助splay $84$ 分
430409
Coros_Trusds楼主2021/8/23 15:53
#include <iostream>

#include <cstdio>

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

namespace Newstd
{
	inline int read()
	{
		int x=0,f=1;char ch=getchar();
		while(ch<'0' || ch>'9')
		{
			if(ch=='-')f=-1;
			ch=getchar();
		}

		while(ch>='0' && ch<='9')
		{
			x=x*10+ch-'0';ch=getchar();
		}
		return x*f;
	}
	inline void print(int x)
	{
		if(x<0)
		{
			putchar('-');x=-x;
		}
		if(x>9)
		{
			print(x/10);
		}
		putchar(x%10+'0');
	}
}

using namespace Newstd;

using namespace std;

const int INF=(1<<29);

const int ma=200005;

struct Splay
{
	int son[3];
	
	int size,cnt;
	
	int val,fa;
};

Splay node[ma];

int a[ma],u[ma];

int rt,chd;

inline bool chk(int p)
{
	return node[node[p].fa].son[1]==p;
} 

inline void PushUp(int p)
{
	node[p].size=node[node[p].son[0]].size+node[node[p].son[1]].size+node[p].cnt;
}

inline void Rotate(int p)
{
	int y=node[p].fa,k=chk(p),w=node[p].son[k^1];
	
	node[y].son[k]=w,node[w].fa=y;
	
	node[node[y].fa].son[chk(y)]=p,node[p].fa=node[y].fa;
	
	node[p].son[k^1]=y,node[y].fa=p;
	
	PushUp(y);
	
	PushUp(p);
}

inline void splay(int p,int goal=0)
{
	while(node[p].fa!=goal)
	{
		int y=node[p].fa,z=node[y].fa;
		
		if(z!=goal)
		{
			if(chk(p)==chk(y))
			{
				Rotate(y);
			}
			
			else
			{
				Rotate(p); 
			}
		}
		
		Rotate(p);
	}
	
	if(goal==0)
	{
		rt=p;
	}
} 

inline void Insert(int k)
{
	int cur=rt,p=0;
	
	while(cur!=0 && node[cur].val!=k)
	{
		p=cur;
		
		cur=node[cur].son[k>node[cur].val];
	}
	
	if(cur!=0)
	{
		node[cur].cnt++;
	}
	
	else
	{
		cur=++chd;
		
		if(p!=0)
		{
			node[p].son[k>node[p].val]=cur;
		}
		
		node[cur].son[0]=node[cur].son[1]=0;
		
		node[cur].val=k,node[cur].fa=p;
		
		node[cur].size=node[cur].cnt=1;
	}
	
	splay(cur);
}

inline int kth(int rk)
{
	int cur=rt;
	
	while(true)
	{
		if(node[cur].son[0]!=0 && node[node[cur].son[0]].size>=rk)
		{
			cur=node[cur].son[0];
		}
		
		else if(rk>node[node[cur].son[0]].size+node[cur].cnt)
		{
			rk=rk-node[node[cur].son[0]].size-node[cur].cnt;
			
			cur=node[cur].son[1];
		}
		
		else
		{
			splay(cur);
			
			return cur;
		}
	}
}

int main(void)
{
	//freopen("in.txt","r",stdin);
	//freopen("ans.txt","w",stdout);
    
	int n,m;
	
	scanf("%d%d",&n,&m);
	
	for(register int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	
	int last=1;
	
	Insert(INF);
	
	Insert(-INF);
	
	int top=0;
	
	for(register int i=1;i<=m;i++)
	{
		scanf("%d",&u[i]);
		
		while(last<=u[i])
		{
			Insert(a[last]);
			
			last++;
		}
		
		top++;
		
		printf("%d\n",node[kth(top+1)].val); 
	} 
	
	return 0;
}
2021/8/23 15:53
加载中...