40ptsRE+TLE+WA求调
查看原帖
40ptsRE+TLE+WA求调
783170
liaiyang楼主2023/11/6 21:36
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define min(a,b) (a<b?a:b) 
#define P pair<int,int>
#define x first
#define y second 
#define rd read()
#define modd(x) (((x)%mod+mod)%mod) 
#define rd read()
#define lowbit(x) ((x)&(-x))
inline int read(int u=0, char c=getchar(), bool f=false){
	for (;!isdigit(c);c=getchar()) f|=c=='-';
	for (;isdigit(c);c=getchar()) u=(u<<1)+(u<<3)+c-'0';
	return f?-u:u;
}
inline void wt(int x){
  	if(x<0) x=-x,putchar('-');
  	if(x>9) wt(x/10);
  	putchar(x%10+48);
}
inline void wt(int x,char c){wt(x),putchar(c);}
const int inf=~0U>>1,linf=~0ULL>>1; 
const int N=1e6+10;
struct node{
	int fa,son[2],v,cnt,siz;
}tr[N];
int n,m,root,cnt,ans,lastans;
void pushup(int x){tr[x].siz=tr[tr[x].son[1]].siz+tr[tr[x].son[0]].siz+tr[x].cnt;}
void rotate(int x){
	int y=tr[x].fa,z=tr[y].fa;
	int k=tr[y].son[1]==x;
	tr[y].son[k]=tr[x].son[k^1];
	tr[tr[x].son[k^1]].fa=y;
	tr[x].son[k^1]=y;
	tr[y].fa=x;
	tr[z].son[tr[z].son[1]==y]=x;
	tr[x].fa=z;
	pushup(y),pushup(x);
}
void splay(int x,int k){
	while(tr[x].fa!=k){
		int y=tr[x].fa,z=tr[y].fa;
		if(z!=k) (tr[y].son[0]==x)^(tr[z].son[0]==y)?rotate(x):rotate(y);
		rotate(x);
	}
	if(k==0) root=x;
}
void find(int v){
	int x=root;
	while(tr[x].son[v>tr[x].v]&&v!=tr[x].v) x=tr[x].son[v>tr[x].v];
	splay(x,0);
}
int get_pre(int v){
	find(v);
	int x=root;
	if(tr[x].v<v) return x;
	x=tr[x].son[0];
	while(tr[x].son[1]) x=tr[x].son[1];
	splay(x,0);
	return x;
}
int get_suc(int v){
	find(v);
	int x=root;
	if(tr[x].v>v) return x;
	x=tr[x].son[1];
	while(tr[x].son[0]) x=tr[x].son[0];
	splay(x,0);
	return x;
}
void del(int v){
	int pre=get_pre(v),suc=get_suc(v);
	splay(pre,0),splay(suc,pre);
	int del=tr[suc].son[0];
	if(tr[del].cnt>1) tr[del].cnt--,splay(del,0);
	else tr[suc].son[0]=0,splay(suc,0);
}
void insert(int v){
	int x=root,p=0;
	while(x&&tr[x].v!=v) p=x,x=tr[x].son[v>tr[x].v];
	if(x) tr[x].cnt++;
	else{
		x=++cnt;
		tr[p].son[v>tr[p].v]=x;
		tr[x].fa=p,tr[x].v=v,tr[x].cnt=tr[x].siz=1;
	}
	splay(x,0);
}
int get_rank(int v){
	insert(v);find(v);
	int res=tr[tr[root].son[0]].siz;
	del(v);
	return res;
}
int get_val(int k){
	int x=root;
	while(1){
		int y=tr[x].son[0];
		if(tr[y].siz+tr[x].cnt<k) k-=tr[y].siz+tr[x].cnt,x=tr[x].son[1];
		else if(tr[y].siz>=k) x=tr[x].son[0];
		else break;
	}
	splay(x,0);
	return tr[x].v;
}
main(){
	insert(-1e9),insert(1e9);
	n=rd;m=rd;
	for(int i=1;i<=n;i++){
		int x=rd;
		insert(x);
	}
	while(m--){
		int op=rd,x=rd^lastans;
		if(op==1) insert(x);
		if(op==2) del(x);
		if(op==3) lastans=get_rank(x);
		if(op==4) lastans=get_val(x+1);
		if(op==5) lastans=tr[get_pre(x)].v;
		if(op==6) lastans=tr[get_suc(x)].v;
		if(op!=1&&op!=2) ans^=lastans;
	}
	wt(ans,'\n');
    return 0;
}
2023/11/6 21:36
加载中...