输入中有求排名为1的数的前驱吗?有求排名为n+1的数的后继吗?如果有该怎么处理?
下面的源代码出现了浮点错误RE,即运行了int qq(int x)、int hj(int x) 中那两句“int cc=5/0;”
#include <bits/stdc++.h>
using namespace std;
namespace io
{
const int L=1<<21|1;
char ibuf[L],*iS,*iT,obuf[L],*oS=obuf,*oT=obuf+L-1,c,st[55];
int f,tp;
#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,L,stdin),(iS==iT?EOF:*iS++)):*iS++)
#define Flush() {fwrite(obuf,1,oS-obuf,stdout);oS=obuf;}
inline void pc(char x)
{
*oS++=x;
if(oS==oT)Flush();
}
inline void gi(int& x)
{ //get
for(f=1,c=gc();c<'0'||c>'9';c=gc())
if(c=='-')f=-1;
for(x=0;c<='9'&&c>='0';c=gc())x=(x<<3)+(x<<1)+(c&15);
x*=f;
}
inline void pr(int x,char ch)
{
if(x<0)pc('-'),x=-x;
tp=0;st[++tp]=x%10^'0';
for(x/=10;x;x/=10)st[++tp]=x%10^'0';
while(tp)pc(st[tp--]);
pc(ch);
}
}; // namespace io
using namespace io;
//0 ls,1 rs,2 sz
int t[63389000][3];int nds=1;
inline void ins(int x)
{
int p=1;
for(int i=32;i>=1;i--)
{
++t[p][2];
if((x>>(i-1))&1)
{
if(t[p][1])p=t[p][1];
else{t[p][1]=++nds;p=nds;}
}
else
{
if(t[p][0])p=t[p][0];
else{t[p][0]=++nds;p=nds;}
}
}
++t[p][2];
}
inline void del(int x)
{
int p=1;
for(int i=32;i>=1;i--)
{
--t[p][2];
if((x>>(i-1))&1)p=t[p][1];
else p=t[p][0];
}
--t[p][2];
}
inline int rk(int x)
{
int p=1,ans=1;
for(int i=32;i>=1&&p;i--)
if((x>>(i-1))&1){ans+=t[t[p][0]][2];p=t[p][1];}
else p=t[p][0];
return ans;
}
inline int kth(int x)
{
int p=1,ans=0;
for(int i=32;i>=1;i--)
{
ans<<=1;
if(x<=t[t[p][0]][2])p=t[p][0];
else{x-=t[t[p][0]][2];ans|=1;p=t[p][1];}
}
return ans;
}
inline int qq(int x)
{
int ccc=rk(x);if(ccc==1)int cc=5/0;
return kth(ccc-1);
}
inline int hj(int x)
{
int ccc=rk(x+1);if(ccc==t[1][2]+1)int cc=5/0;
return kth(ccc);
}
int main()
{
ios::sync_with_stdio(false);
int m;gi(m);
for(int i=1;i<=m;i++)
{//0=ls,1=rs,2=sz
int o,c;gi(o);gi(c);
if(o==1)ins(c);
else if(o==2)del(c);
else if(o==3)pr(rk(c),'\n');
else if(o==4)pr(kth(c),'\n');
else if(o==5)pr(qq(c),'\n');
else pr(hj(c),'\n');
}
Flush();fclose(stdout);
return 0;
}