可过弱版可过阳历范浩强算法O分求条
查看原帖
可过弱版可过阳历范浩强算法O分求条
1011568
CodingFrog1楼主2025/2/6 18:27
#include<bits/stdc++.h>
using namespace std;
int n;
struct node
{
	int lc,rc;
	int val,fix,siz;
};
int ts=0,root=0;
node fhqt[100005];
int ans=0,last=0;
void new_node(int x)//开点 
{
	++ts;
	fhqt[ts].siz=1;
	fhqt[ts].lc=fhqt[ts].rc=0;
	fhqt[ts].val=x,fhqt[ts].fix=rand();//优先级 
	return ;
}

void pushup(int u)//重传大小 
{
	fhqt[u].siz=fhqt[fhqt[u].lc].siz+fhqt[fhqt[u].rc].siz+1;
	return;
}

void split(int u,int x,int &l,int &r)//分裂 
{
	if(u==0)//该子树不存在 
	{
		l=r=0;
		return ;
	}
	if(fhqt[u].val<=x)
	{
		l=u;//左子树之根为原根 
		split(fhqt[u].rc,x,fhqt[u].rc,r);//切右子树 
	}
	else
	{
		r=u;
		split(fhqt[u].lc,x,l,fhqt[u].lc);
	}
	pushup(u);
	return ;
}

int merge(int l,int r)
{
	if(l==0||r==0)//子承父业直接接上 
	{
		return l+r;
	}
	if(fhqt[l].fix>fhqt[r].fix)//左权大于右权 
	{
		fhqt[l].rc=merge(fhqt[l].rc,r);//左树之右子树作子树之根,左树之根作根 
		pushup(l);
		return l;
	}
	else
	{
		fhqt[r].lc=merge(l,fhqt[r].lc);
		pushup(r);
		return r;
	}
}

int insert(int x)//插入 
{
	int l,r;
	split(root,x,l,r);
	new_node(x);
	root=merge(merge(l,ts),r);
	return ts;
}

int dlt(int x)//删除 
{
	int l,m,r;
	split(root,x,l,r);
	split(l,x-1,l,m);
	m=merge(fhqt[m].lc,fhqt[m].rc);
	root=merge(merge(l,m),r);
	return root;
}

int getRank(int x)//知数求位 
{
	int l,r,res;
	split(root,x-1,l,r);
	res=fhqt[l].siz+1;
	root=merge(l,r);
	return res;
}

int getNum(int u,int k)//知位求数
{
	if(k==fhqt[fhqt[u].lc].siz+1) return u;
	if(k<=fhqt[fhqt[u].lc].siz) return getNum(fhqt[u].lc,k);
	return getNum(fhqt[u].rc,k-fhqt[fhqt[u].lc].siz-1);
}

int pre(int x)
{
	int l,r,res;
	split(root,x-1,l,r);
	res=fhqt[getNum(l,fhqt[l].siz)].val;
	root=merge(l,r);
	return res;
}

int suc(int x)
{
	int l,r,res;
	split(root,x,l,r);
	res=fhqt[getNum(r,1)].val;
	root=merge(l,r);
	return res;
}
int m;
int main()
{
	cin>>m>>n;
	for(int i=1;i<=m;i++)
	{
		int iiii;
		cin>>iiii;
		insert(iiii);
	}
	while(n--)
	{
		int opt,x;
		cin>>opt>>x;
		x^=last;
		if(opt==1)
		{
			insert(x);
		}
		if(opt==2)
		{
			dlt(x);
		}
		if(opt==3)
		{
			last=getRank(x);
			ans^=last;
		}
		if(opt==4)
		{
			last=fhqt[getNum(root,x)].val;
			ans^=last;
		}
		if(opt==5)
		{
			last=pre(x);
			ans^=last;
		}
		if(opt==6)
		{
			last=suc(x);
			ans^=last;
		}
	}
	cout<<ans<<endl;
	return 0;
}
2025/2/6 18:27
加载中...