JS_TZ_ZHR @ 2020-04-16 21:28:16
RT,本机和洛谷都WA了,求差错。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,total,root,x,a,lastans,ans;
struct Treap {
int son[2];
int val;
int size,cnt;
int dat;
} t[2000005];
inline int newnode(int val) {
t[++total].val=val;
t[total].dat=rand();
t[total].size=t[total].cnt=1;
return total;
}
inline void push_up(int p) {
t[p].size=t[t[p].son[0]].size+t[t[p].son[1]].size+t[p].cnt;
}
inline void spin(int &p,bool opt) {
int temp=t[p].son[opt^1];
t[p].son[opt^1]=t[temp].son[opt];
t[temp].son[opt]=p;
p=temp;
push_up(t[p].son[opt]);
push_up(p);
}
void insert(int &p,int val) {
if(!p) {
p=newnode(val);
return;
}
if(val==t[p].val)
t[p].cnt++;
else {
if(val<t[p].val) {
insert(t[p].son[0],val);
if(t[p].dat<t[t[p].son[0]].dat)spin(p,1);
} else {
insert(t[p].son[1],val);
if(t[p].dat<t[t[p].son[1]].dat)spin(p,0);
}
}
push_up(p);
}
void _delete(int &p,int val) {
if(!p)return;
if(val==t[p].val) {
if(t[p].cnt>1)t[p].cnt--,push_up(p);
else {
if(t[p].son[0]||t[p].son[1]) {
if(!t[p].son[1]||t[t[p].son[0]].dat>t[t[p].son[1]].dat)
spin(p,1),_delete(t[p].son[1],val);
else spin(p,0),_delete(t[p].son[0],val);
push_up(p);
} else p=0;
}
}
if(val<t[p].val)_delete(t[p].son[0],val);
else _delete(t[p].son[1],val);
push_up(p);
}
int rank(int p,int val) {
if(!p)return 0;
if(val==t[p].val)return t[t[p].son[0]].size+1;
if(val<t[p].val)return rank(t[p].son[0],val);
else return rank(t[p].son[1],val)+t[t[p].son[0]].size+t[p].cnt;
}
int val(int p,int rank) {
if(!p)return 0;
if(rank<=t[t[p].son[0]].size)return val(t[p].son[0],rank);
else if(rank<=t[t[p].son[0]].size+t[p].cnt)return t[p].val;
else return val(t[p].son[1],rank-(t[t[p].son[0]].size+t[p].cnt));
}
int pre(int val) {
int p=root,res;
while(p) {
if(t[p].val<val) {
res=t[p].val;
p=t[p].son[1];
} else p=t[p].son[0];
}
return res;
}
int next(int val) {
int p=root,res;
while(p) {
if(t[p].val>val) {
res=t[p].val;
p=t[p].son[0];
} else p=t[p].son[1];
}
return res;
}
signed main() {
scanf("%lld%lld",&n,&m);
for(int i=1; i<=n; i++) {
scanf("%lld",&a);
insert(root,a);
}
while(m--) {
scanf("%lld%lld",&x,&a);
a^=lastans;
//printf("%lld %lld %lld\n",x,a,lastans);
if(x==1)insert(root,a);
if(x==2)_delete(root,a);
if(x==3) {
lastans=rank(root,a)+1;
ans^=lastans;
}
if(x==4) {
lastans=val(root,a);
ans^=lastans;
}
if(x==5) {
lastans=pre(a);
ans^=lastans;
}
if(x==6) {
lastans=next(a);
ans^=lastans;
}
}
printf("%lld\n",ans);
}
by liqingyang @ 2020-04-16 22:04:51
@愚かなる弟よ emmmm,建议您写一个printf
函数
by liqingyang @ 2020-04-16 22:05:09
@愚かなる弟よ 或者自己写一个暴力或粘贴题解对拍
by lytqwq @ 2020-04-24 21:38:16
@愚かなる弟よ rank函数return 1;