| mt19937 rnd(time(0)); |
| struct FHQtreap{ |
| int lc[N],rc[N],val[N],key[N],siz[N],pool,root; |
| int create(int x){ |
| int p=++pool; |
| val[p]=x; |
| siz[p]=1; |
| key[p]=rnd(); |
| lc[p]=rc[p]=0; |
| return p; |
| } |
| void update(int p){ |
| if(!p)return; |
| siz[p]=siz[lc[p]]+siz[rc[p]]+1; |
| } |
| void split(int p,int d,int &x,int &y){ |
| if(!p){ |
| x=y=0; |
| return; |
| } |
| if(val[p]<=d){ |
| x=p; |
| split(rc[p],d,rc[p],y); |
| } |
| else{ |
| y=p; |
| split(lc[p],d,x,lc[p]); |
| } |
| update(p); |
| } |
| int merge(int x,int y){ |
| if(x==0||y==0)return x^y; |
| if(key[x]>key[y]){ |
| rc[x]=merge(rc[x],y); |
| update(x); |
| return x; |
| } |
| else{ |
| lc[y]=merge(x,lc[y]); |
| update(y); |
| return y; |
| } |
| } |
| void insert(int d){ |
| int x,y; |
| split(root,d-1,x,y); |
| root=merge(merge(x,create(d)),y); |
| } |
| void remove(int d){ |
| int x,y,z; |
| split(root,d,x,z); |
| split(x,d-1,x,y); |
| if(y){ |
| y=merge(lc[y],rc[y]); |
| } |
| root=merge(merge(x,y),z); |
| } |
| int rank(int d){ |
| int x,y,ret; |
| split(root,d-1,x,y); |
| ret=siz[x]+1; |
| root=merge(x,y); |
| return ret; |
| } |
| int kth(int k){ |
| int p=root; |
| while(siz[lc[p]]+1!=k){ |
| if(siz[lc[p]]>=k)p=lc[p]; |
| else{ |
| k-=siz[lc[p]]+1; |
| p=rc[p]; |
| } |
| } |
| return val[p]; |
| } |
| int pre(int d){ |
| int x,y,p; |
| split(root,d-1,x,y); |
| p=x; |
| while(rc[p])p=rc[p]; |
| root=merge(x,y); |
| return val[p]; |
| } |
| int nxt(int d){ |
| int x,y,p; |
| split(root,d,x,y); |
| p=y; |
| while(lc[p])p=lc[p]; |
| root=merge(x,y); |
| return val[p]; |
| } |
| }T; |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效