死循环了,求助QwQ
Code:
#include<cstdlib>
#include<cstdio>
#include<ctime>
class fhq_Treap
{
private:
struct Node
{
int L,R,s,val,rnd;
Node(int val=0):s(1),val(val),rnd(rand()){}
}t[25000005];
int cnt,root[500005];
void undate(int now)
{
t[now].s=t[t[now].L].s+t[t[now].R].s+1;
}
int merge(int x,int y)
{
if(!x||!y)return x+y;
int p=++cnt;
if(t[x].rnd>t[y].rnd)t[p]=t[x],t[p].R=merge(t[p].R,y);
else t[p]=t[y],t[p].L=merge(x,t[p].L);
undate(p);return p;
}
void split(int now,int k,int&x,int&y)
{
if(!now)return(void)(x=y=0);
if(t[now].val<=k)
{
t[x=++cnt]=t[now];
split(t[x].R,k,t[x].R,y);
undate(x);
}
else
{
t[y=++cnt]=t[now];
split(t[y].L,k,x,t[y].L);
undate(y);
}
}
int kth(int now,int rk)
{
while(1)
{
if(rk==t[t[now].L].s+1)return now;
if(rk<=t[t[now].L].s)now=t[now].L;
else rk-=t[t[now].L].s+1,now=t[now].R;
}
}
public:
void push(int pre,int val)
{
int x,y;
split(root[pre],val,x,y);
t[++cnt]=Node(val);
root[pre]=merge(merge(x,cnt),y);
}
void pop(int pre,int val)
{
int x,y,z;
split(root[pre],val,x,y);split(x,val-1,x,y);
root[pre]=merge(merge(x,merge(t[y].L,t[y].R)),z);
}
int find(int pre,int val)
{
int x,y,ans;
split(root[pre],val-1,x,y);
ans=t[x].s+1;root[pre]=merge(x,y);
return ans;
}
int rank(int pre,int k)
{
return t[kth(root[pre],k)].val;
}
int lower(int pre,int val)
{
int x,y,ans;
split(root[pre],val-1,x,y);
if(!x)return -2147483647;
ans=kth(x,t[x].s);root[pre]=merge(x,y);
return ans;
}
int upper(int pre,int val)
{
int x,y,ans;
split(root[pre],val,x,y);
if(!y)return 2147483647;
ans=kth(y,1);root[pre]=merge(x,y);
return ans;
}
}BST;
signed main()
{
srand((unsigned)time(0));
int n,v,x,opt;scanf("%d",&n);
while(n--)
{
scanf("%d%d%d",&v,&opt,&x);
if(opt==1)BST.push(v,x);
if(opt==2)BST.pop(v,x);
if(opt==3)printf("%d\n",BST.find(v,x));
if(opt==4)printf("%d\n",BST.rank(v,x));
if(opt==5)printf("%d\n",BST.lower(v,x));
if(opt==6)printf("%d\n",BST.upper(v,x));
}
}