rt.
评测记录->https://www.luogu.com.cn/record/90990213。
有 WA 是可以理解的,但是 MLE 就很奇怪。算了下空间,也就十几 MB,完全不可能 MLE。求助各位大佬 qwq。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3f
//#define int long long
#define PII pair<int,int>
#define rep(k,l,r) for(int k=l;k<=r;++k)
#define per(k,r,l) for(int k=r;k>=l;--k)
#define cl(f,x) memset(f,x,sizeof(f))
using namespace std;
const int N=1e5+5;
mt19937 rd(time(0));
struct node {
int val,x,siz,l,r;
}; node tree[N];
int tot,root;
int add_node(int val) {
tree[++tot]={val,(int)rd(),1,0,0}; return tot;
}
void push_up(int k) {
tree[k].siz=tree[tree[k].l].siz+tree[tree[k].r].siz+1;
}
void split(int k,int val,int &u,int &v) {
if(!k) {
u=v=0; return;
}
if(tree[k].val<=val)
u=k,split(tree[k].r,val,tree[k].r,v);
else
v=k,split(tree[k].l,val,u,tree[k].l);
push_up(k);
}
int merge(int u,int v) {
if(!u||!v)
return u|v;
if(tree[u].x<tree[v].x) {
tree[u].r=merge(tree[u].r,v);
push_up(u);
return u;
} else {
tree[v].l=merge(u,tree[v].l);
push_up(v);
return v;
}
}
void ins(int val) {
int u=0,v=0;
split(root,val,u,v);
root=merge(merge(u,add_node(val)),v);
}
void del(int val) {
int u=0,v=0,w=0;
split(root,val,u,v);
split(u,val-1,u,w);
w=merge(tree[w].l,tree[w].r);
root=merge(v,merge(u,w));
}
int query_val(int k,int rk) {
if(rk<=tree[tree[k].l].siz)
return query_val(tree[k].l,rk);
else if(tree[tree[k].l].siz+1==rk)
return tree[k].val;
else
return query_val(tree[k].r,rk-tree[tree[k].l].siz-1);
}
int query_rk(int val) {
int u=0,v=0;
split(root,val-1,u,v);
int res=tree[u].siz+1;
root=merge(u,v);
return res;
}
int query_pre(int val) {
int u=0,v=0;
split(root,val-1,u,v);
int res=query_val(u,tree[u].siz);
root=merge(u,v);
return res;
}
int query_nxt(int val) {
int u=0,v=0;
split(root,val,u,v);
int res=query_val(v,1);
root=merge(u,v);
return res;
}
signed main() {
int q;
scanf("%d",&q);
rep(_,1,q) {
int op,val;
scanf("%d%d",&op,&val);
if(op==1)
ins(val);
else if(op==2)
del(val);
else if(op==3)
printf("%d\n",query_rk(val));
else if(op==4)
printf("%d\n",query_val(root,val));
else if(op==5)
printf("%d\n",query_pre(val));
else if(op==6)
printf("%d\n",query_nxt(val));
}
return 0;
}