结果:评测结果
#include <bits/stdc++.h>
using namespace std;
int n;
int root;
struct nodee{
int data,fa,l,r,num,sum;
}a[1100007];
int js=0;
inline void dfs(int zz)
{
if(a[zz].l)
dfs(a[zz].l);
//cout<<a[zz].data<<" ";
if(a[zz].r)
dfs(a[zz].r);
}
inline bool child(int x)
{
if(a[a[x].fa].l==x)
return 0;
return 1;
}
inline void updata(int x)
{
if(x)
a[x].sum=a[a[x].l].sum+a[a[x].r].sum+a[x].num;
}
inline void rotate(int x)
{
int fa=a[x].fa;
if(child(x))
{
a[fa].r=a[x].l;
a[a[x].l].fa=fa;
a[x].l=fa;
}
else
{
a[fa].l=a[x].r;
a[a[x].r].fa=fa;
a[x].r=fa;
}
if(child(fa))
a[a[fa].fa].r=x;
else
a[a[fa].fa].l=x;
a[x].fa=a[fa].fa;
a[fa].fa=x;
updata(fa);
updata(x);
}
inline void splay(int x,int too)
{
too=a[too].fa;
while(a[x].fa!=too)
{
// cout<<x<<" "<<a[x].fa<<" "<<root<<endl;
int fa=a[x].fa;
if(a[fa].fa==too)
{
rotate(x);
}
else if(child(fa)^child(x))//不同
{
rotate(x);
rotate(x);
}
else
{
rotate(fa);
rotate(x);
}
}
if(!too)
root=x;
}
inline int find(int x,int zz)
{
// cout<<x<<" "<<zz<<" "<<a[zz].data<<" "<<a[zz].l<<" "<<a[a[zz].l].data<<endl;
if(a[zz].data==x)
{
// cout<<"find"<<endl;
return zz;
}
if(x<a[zz].data)
{
if(a[zz].l)
{
// cout<<x<<endl;
int dd=find(x,a[zz].l);
return dd;
}
else
{
return zz;
}
}
else
{
if(a[zz].r)
{
//cout<<x<<endl;
int dd=find(x,a[zz].r);
return dd;
}
else
{
return zz;
}
}
}
inline int frontt(int x)
{
int zz=find(x,root);
splay(zz,root);
//cout<<a[11].data<<" "<<a[11].fa<<" "<<root<<" "<<zz<<" "<<a[zz].data<<" "<<a[zz].l<<" "<<a[zz].r<<endl;
if(x<=a[zz].data)
{
zz=a[zz].l;
while(a[zz].r)
zz=a[zz].r;
}
return zz;
}
inline int behindd(int x)
{
int zz=find(x,root);
splay(zz,root);
if(x>=a[zz].data)
{
zz=a[zz].r;
while(a[zz].l)
zz=a[zz].l;
}
return zz;
}
inline void newnodee(int data,int fa)
{
++js;
a[js].data=data;
a[js].fa=fa;
a[js].num=a[js].sum=1;
}
inline void cutnodee(int x)
{
int fa=a[x].fa;
if(a[x].l==0&&a[x].r==0)
{
if(child(x))
a[fa].r=0;
else
a[fa].l=0;
a[x].fa=0;
if(root==x)
{
root=0;
return;
}
splay(fa,root);
}
else if(!a[x].l)
{
if(child(x))
a[fa].r=a[x].r;
else
a[fa].l=a[x].r;
a[a[x].r].fa=fa;
updata(a[x].r);
updata(fa);
if(root==x)
{
root=a[x].r;
return;
}
splay(fa,root);
}
else if(!a[x].r)
{
if(child(x))
a[fa].r=a[x].l;
else
a[fa].l=a[x].l;
a[a[x].l].fa=fa;
updata(a[x].l);
updata(fa);
if(root==x)
{
root=a[x].l;
return;
}
splay(fa,root);
}
else
{
int c=behindd(a[x].data);
// cout<<c<<" "<<a[c].data<<endl;
if(a[c].fa==x)
{
swap(a[x].l,a[c].l);
swap(a[x].r,a[c].r);
swap(a[x].fa,a[c].fa);
if(a[a[c].fa].r==x)
a[a[c].fa].r=c;
else
a[a[c].fa].l=c;
a[a[c].l].fa=c;
a[a[c].r].fa=c;
a[a[x].r].fa=x;
a[c].r=a[x].r;
a[a[x].r].fa=c;
a[x].fa=0;
a[x].r=0;
if(root==x)
{
root=c;
updata(a[x].r);
updata(a[x].fa);
splay(a[x].fa,root);
return;
}
updata(a[c].r);
updata(c);
splay(c,root);
return;
}
swap(a[x].l,a[c].l);
swap(a[x].r,a[c].r);
swap(a[x].fa,a[c].fa);
if(a[a[c].fa].r==x)
a[a[c].fa].r=c;
else
a[a[c].fa].l=c;
a[a[c].l].fa=c;
a[a[c].r].fa=c;
a[a[x].fa].l=x;
a[a[x].r].fa=x;
fa=a[x].fa;
a[fa].l=a[x].r;
a[a[x].r].fa=fa;
if(root==x)
{
root=c;
updata(a[x].r);
updata(fa);
a[x].fa=0;
a[x].r=0;
return;
}
updata(a[x].r);
updata(fa);
a[x].fa=0;
a[x].r=0;
splay(fa,root);
}
}
inline void add(int x)
{
if(!root)
{
newnodee(x,0);
root=js;
return;
}
int zz=find(x,root);
// cout<<zz<<" "<<a[zz].data<<" "<<x<<endl;
// cout<<root<<endl;
// for(register int i=1;i<=js;++i)
// cout<<i<<" "<<a[i].data<<" "<<a[i].l<<" "<<a[i].r<<" "<<a[i].fa<<endl;
if(a[zz].data==x)
{
++a[zz].num;
++a[zz].sum;
splay(x,root);
return;
}
newnodee(x,zz);
if(x>a[zz].data)
a[zz].r=js;
else
{
a[zz].l=js;
// cout<<zz<<" "<<a[zz].l<<" "<<a[a[zz].l].fa<<endl;
}
updata(zz);
// cout<<zz<<" "<<a[zz].l<<" "<<a[a[zz].l].fa<<endl;
splay(zz,root);
// cout<<zz<<" "<<a[zz].l<<" "<<a[a[zz].l].fa<<endl;
}
inline void dele(int x)
{
int zz=find(x,root);
//cout<<zz<<" "<<a[zz].data<<" "<<a[zz].num<<endl;
--a[zz].num;
--a[zz].sum;
// cout<<zz<<" "<<a[zz].num<<endl;
if(!a[zz].num)
{
updata(a[zz].fa);
cutnodee(zz);
}
else
{
updata(zz);
splay(zz,root);
}
}
inline int rank1(int x)
{
int zz=find(x,root);
splay(zz,root);
return a[a[zz].l].sum+1;
}
int rank2(int x,int zz,int sum)
{
if(a[a[zz].l].sum+sum+1==x)
{
splay(zz,root);
return a[zz].data;;
}
if(x<a[a[zz].l].sum+sum+1)
{
if(a[zz].l)
{
int dd=rank2(x,a[zz].l,sum);
splay(zz,root);
return dd;
}
else
{
splay(zz,root);
return a[zz].data;
}
}
else
{
if(a[zz].r)
{
int dd=rank2(x,a[zz].r,sum+a[a[zz].l].sum+1);
splay(zz,root);
return dd;
}
else
{
splay(zz,root);
return a[zz].data;
}
}
}
int main()
{
scanf("%d",&n);
int op,x;
for(register int i=1;i<=n;++i)
{
// cout<<a[13].l<<endl;
// cout<<i<<endl;
a[0].l=a[0].r=a[0].sum=0;
scanf("%d%d",&op,&x);
if(op==1)
{
add(x);
}
if(op==2)
{
dele(x);
}
if(op==3)
{
printf("%d\n",rank1(x));
}
if(op==4)
{
printf("%d\n",rank2(x,root,0));
}
if(op==5)
{
printf("%d\n",a[frontt(x)].data);
}
if(op==6)
{
printf("%d\n",a[behindd(x)].data);
}
// dfs(root);
// cout<<endl;
// cout<<root<<endl;
// for(register int i=1;i<=js;++i)
// cout<<i<<" "<<a[i].data<<" "<<a[i].l<<" "<<a[i].r<<" "<<a[i].fa<<endl;
}
return 0;
}