QAQ,本地OK,交上去为什么RE啊
查看原帖
QAQ,本地OK,交上去为什么RE啊
226944
光锥xn楼主2021/11/13 19:22

原版过了,加强版调了好久,本地能过来着(qwq(大雾

#include<bits/stdc++.h>
//#define int long long
#define inf 2147483647
using namespace std;
int tot,n,m,root,ans;
struct mjm{
	int l,r,val,cnt,date,size;
	#define ls(p) a[p].l
	#define rs(p) a[p].r
}a[2000005];
inline int read()
{
	int x=0;int f=0;char c=getchar();
	for(;!isdigit(c);c=getchar())if(c=='-')f=1;
	for(; isdigit(c);c=getchar())x=(x<<3)+(x<<1)+(c^48);
	if(f)return -x;
	return x;
}
void push_up(int p)
{
	a[p].size=a[ls(p)].size+a[rs(p)].size+a[p].cnt;
}
int newn(int val)
{
	a[++tot].val=val;
	a[tot].date=rand();
	a[tot].cnt=a[tot].size=1;
	return tot;
}
void build()
{
	newn(-inf);newn(inf);
	root=1;a[1].r=2;
	push_up(root);
}
int getrank(int p,int val)
{
	if(!p)return 1;
	if(a[p].val==val)return a[ls(p)].size+1;
	if(a[p].val>val)return getrank(ls(p),val);
	if(a[p].val<val)return getrank(rs(p),val)+a[ls(p)].size+a[p].cnt;
}
int getval(int p,int rank)
{
	if(!p)return inf;
	if(rank>a[ls(p)].size&&rank<=a[ls(p)].size+a[p].cnt)return a[p].val;
	if(rank<=a[ls(p)].size)return getval(ls(p),rank);
	return getval(rs(p),rank-a[ls(p)].size-a[p].cnt);
}
void zag(int &p)
{
	int q=rs(p);
	a[p].r=a[q].l;a[q].l=p;p=q;
	push_up(p);push_up(ls(p));
}
int zig(int &p)
{
	int q=ls(p);
	a[p].l=a[q].r;a[q].r=p;p=q;
	push_up(p);push_up(rs(p));
}
int getpre(int val)
{
	int ans=1,p=root;
	while(p){
		if(a[p].val==val){
			if(ls(p)){
				p=ls(p);
				while(rs(p))p=rs(p);
				ans=p;
			}
			break;
		}
		if(val>a[p].val&&a[p].val>a[ans].val)ans=p;
		p=val>a[p].val?rs(p):ls(p);
	}
	return a[ans].val;
}
int getnext(int val)
{
	int ans=2,p=root;
	while(p){
		if(val==a[p].val){
			if(rs(p)){
				p=rs(p);
				while(ls(p))p=ls(p);
				ans=p;
			}
			break;
		}
		if(val<a[p].val&&a[p].val<a[ans].val)ans=p;
		p=val>a[p].val?rs(p):ls(p);
	}
	return a[ans].val;
}
void insert(int &p,int val)
{
	if(!p){p=newn(val);return;}
	if(a[p].val==val){a[p].cnt++;push_up(p);return;}
	if(a[p].val>val){
		insert(ls(p),val);
		if(a[ls(p)].date>a[p].date)zig(p);
	}
	if(a[p].val<val){
		insert(rs(p),val);
		if(a[rs(p)].date>a[p].date)zag(p);
	}
	push_up(p);
}
void erase(int &p,int val)
{
	if(!p)return;
	if(a[p].val==val){
		if(a[p].cnt>1){a[p].cnt--;push_up(p);return;}
		if(ls(p)||rs(p)){
			if(!rs(p)||a[ls(p)].date>a[rs(p)].date){zig(p);erase(rs(p),val);}
			else {zag(p);erase(ls(p),val);}
			push_up(p);
		}
		else p=0;
		return;
	}
	if(a[p].val>val)erase(ls(p),val);
	if(a[p].val<val)erase(rs(p),val);
	push_up(p);
}
int main()
{
	//freopen("p6136_2.in","r",stdin);
	register int i,op,x,last=0;
	build();
	n=read();m=read();
	for(i=1;i<=n;i++){
		x=read();
		insert(root,x);
	}
	for(i=1;i<=m;i++){
		op=read();x=read();
		x=x^last;
		//printf("%d %d\n\n",op,x);
		if(op==1)insert(root,x);
		if(op==2)erase(root,x);
		if(op==3){
			last=getrank(root,x)-1;ans^=last;
			//printf("%d\n",last);
		}
		if(op==4){
			last=getval(root,x+1);ans^=last;
			//printf("%d\n",last);
		}
		if(op==5){
			last=getpre(x);ans^=last;
			//printf("%d\n",last);
		}
		if(op==6){
			last=getnext(x);ans^=last;
			//printf("%d\n",last);
		}
	}
	printf("%d",ans);
}
2021/11/13 19:22
加载中...