普通平衡树76pts求调
查看原帖
普通平衡树76pts求调
876418
HHYQ_07楼主2023/10/5 23:31

空间爆了,这种情况还有救吗?

#include<bits/stdc++.h>
using namespace std;
#define reg register
const int N=8e6+5;
int tot;
struct node
{
	int ls,rs,delta;
}t[N];
inline void add(int &p,int l,int r,int x,int k)
{
	if(!p)p=++tot;
	if(l==r)
	{
		t[p].delta+=k;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid)add(t[p].ls,l,mid,x,k);
	else add(t[p].rs,mid+1,r,x,k);
	t[p].delta=t[t[p].ls].delta+t[t[p].rs].delta;
	return;
}
inline int query_pos(int p,int l,int r,int L,int R)
{
	if(L<=l&&r<=R)return t[p].delta;
	int mid=(l+r)>>1,ans=0;
	if(L<=mid)ans+=query_pos(t[p].ls,l,mid,L,R);
	if(mid<R)ans+=query_pos(t[p].rs,mid+1,r,L,R);
	return ans;
}
inline int query_kth(int p,int l,int r,int k)
{
	if(l==r)return l;
	int mid=(l+r)>>1;
	if(k<=t[t[p].ls].delta)return query_kth(t[p].ls,l,mid,k);
	else return query_kth(t[p].rs,mid+1,r,k-t[t[p].ls].delta);
}
int main()
{
	reg int n,m,opt,x,inf=(1<<30),root=0,lastans=0,ans=0;
	cin>>n>>m;
	while(n--)
	{
		cin>>x;
		add(root,0,inf,x,1);
	}
	while(m--)
	{
		cin>>opt>>x;
		x^=lastans;
		if(opt==1)add(root,0,inf,x,1);
		else if(opt==2)add(root,0,inf,x,-1);
		else if(opt==3)lastans=query_pos(1,0,inf,0,x-1)+1;
		else if(opt==4)lastans=query_kth(1,0,inf,x);
		else if(opt==5)lastans=query_kth(1,0,inf,query_pos(1,0,inf,0,x-1));
		else lastans=query_kth(1,0,inf,query_pos(1,0,inf,0,x)+1);
		if(opt>=3)ans^=lastans;
	} 
	cout<<ans;
	return 0;
}
2023/10/5 23:31
加载中...