标签:
#include<cstdio>
#include<ctime>
#include<cstdlib>
struct shu
{
int l,r,sum1,zhi,dui,sum2;
}a[100006];
int n,root,size,ans;
void you(int &a1)
{
int t=a[a1].l;
a[a1].l=a[t].r;
a[t].r=a1;
a[t].sum1=a[a1].sum1;
a[a1].sum1=a[a[a1].l].sum1+a[a[a1].r].sum1+a[a1].sum2;
a1=t;
return;
}
void zuo(int &a1)
{
int t=a[a1].r;
a[a1].r=a[t].l;
a[t].l=a1;
a[t].sum1=a[a1].sum1;
a[a1].sum1=a[a[a1].l].sum1+a[a[a1].r].sum1+a[a1].sum2;
a1=t;
return;
}
void cha(int &a1,int a2)
{
if(a1==0)
{
size++;
a1=size;
a[a1].sum1=1;
a[a1].sum2=1;
a[a1].zhi=a2;
a[a1].dui=rand();
return;
}
a[a1].sum1++;
if(a[a1].zhi==a2)
{
a[a1].sum2++;
return;
}
if(a2<a[a1].zhi)
{
cha(a[a1].l,a2);
if(a[a[a1].l].dui<a[a1].dui)
you(a1);
}
else
{
cha(a[a1].r,a2);
if(a[a[a1].r].dui<a[a1].dui)
zuo(a1);
}
}
void shan(int &a1,int a2)
{
if(a1==0)
return;
if(a[a1].zhi==a2)
{
if(a[a1].sum2>1)
{
a[a1].sum2--;
a[a1].sum1--;
}
else if(a[a1].l*a[a1].r==0)
a1=a[a1].l+a[a1].r;
else if(a[a[a1].l].dui<a[a[a1].r].dui)
{
you(a1);
shan(a1,a2);
}
else
{
zuo(a1);
shan(a1,a2);
}
return;
}
a[a1].sum1--;
if(a[a1].zhi<a2)
shan(a[a1].r,a2);
else
shan(a[a1].l,a2);
return;
}
int cha1(int a1,int a2)
{
if(a1==0)
return 0;
if(a[a1].zhi==a2)
return a[a[a1].l].sum1+1;
if(a[a1].zhi>a2)
return cha1(a[a1].l,a2);
return a[a[a1].l].sum1+a[a1].sum2+cha1(a[a1].r,a2);
}
int cha2(int a1,int a2)
{
if(a1==0)
return 0;
if(a[a[a1].l].sum1>=a2)
return cha2(a[a1].l,a2);
if(a[a[a1].l].sum1+a[a1].sum2>=a2)
return a[a1].zhi;
return cha2(a[a1].r,a2-a[a[a1].l].sum1-a[a1].sum2);
}
void qian(int a1,int a2)
{
if(a1==0)
return;
if(a[a1].zhi<a2)
{
ans=a[a1].zhi;
qian(a[a1].r,a2);
}
else
qian(a[a1].l,a2);
return;
}
void hou(int a1,int a2)
{
if(a1==0)
return;
if(a[a1].zhi>a2)
{
ans=a[a1].zhi;
hou(a[a1].l,a2);
}
else
hou(a[a1].r,a2);
return;
}
int main()
{
srand(time(0));
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int a1,a2;
scanf("%d%d",&a1,&a2);
if(a1==1)
cha(root,a2);
if(a1==2)
shan(root,a2);
if(a1==3)
printf("%d\n",cha1(root,a2));
if(a1==4)
printf("%d\n",cha2(root,a2));
if(a1==5)
{
ans=0;
qian(root,a2);
printf("%d\n",ans);
}
if(a1==6)
{
ans=0;
hou(root,a2);
printf("%d\n",ans);
}
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/xydddd/p/5130846.html