| struct jjtree |
| { |
| inline void up(rint x){sz[x]=sz[son[x][0]]+sz[son[x][1]]+cnt[x];} |
| inline bool so(rint x){return x==son[fa[x]][1];} |
| inline void clear(rint x){fa[x]=son[x][0]=son[x][1]=cnt[x]=v[x]=sz[x]=0;} |
| inline void xuan(rint x){ |
| rint y=fa[x],z=fa[y];bool op=so(x); |
| son[y][op]=son[x][op^1];if(son[y][op])fa[son[y][op]]=y; |
| son[x][op^1]=y,fa[y]=x;if(z)son[z][y==son[z][1]]=x;fa[x]=z; |
| up(x),up(y); |
| } |
| inline void splay(rint x,rint y=0){ |
| if(!y)rt=x; |
| while(fa[x]!=y){ |
| rint k1=fa[x]; |
| if(fa[k1]!=y)xuan(so(x)==so(k1)?k1:x); |
| xuan(x); |
| } |
| } |
| inline void insert(int x){ |
| if(!rt){ |
| v[++tot]=x; |
| ++cnt[tot];rt=tot;up(rt);return; |
| } |
| int now=rt,f=0; |
| while(1){ |
| |
| if(v[now]==x){ |
| ++cnt[now];up(now);up(f);splay(now);return; |
| } |
| f=now,now=son[now][x>v[now]]; |
| if(!now){ |
| v[++tot]=x,++cnt[tot],fa[tot]=f; |
| son[f][x>v[f]]=tot;up(tot),up(f),splay(tot); |
| return; |
| } |
| } |
| } |
| inline int rk(int x){ |
| int ans=0,now=rt; |
| while(1){ |
| if(x<v[now])now=son[now][0]; |
| else{ |
| ans+=sz[son[now][0]]; |
| if(!now)return ans+1; |
| if(x==v[now])return splay(now),ans+1; |
| ans+=cnt[now],now=son[now][1]; |
| } |
| } |
| } |
| inline int kth(int k){ |
| int now=rt; |
| while(1){ |
| if(son[now][0]&&k<=sz[son[now][0]])now=son[now][0]; |
| else{ |
| k-=sz[son[now][0]]+cnt[now]; |
| if(k<=0)return splay(now),v[now]; |
| now=son[now][1]; |
| } |
| } |
| } |
| inline int pre(){ |
| int now=son[rt][0]; |
| if(!now)return 0; |
| while(son[now][1])now=son[now][1]; |
| splay(now); |
| return now; |
| } |
| inline int nxt(){ |
| int now=son[rt][1]; |
| if(!now)return 0; |
| while(son[now][0])now=son[now][0]; |
| splay(now); |
| return now; |
| } |
| inline void del(int k){ |
| rk(k); |
| |
| if(cnt[rt]>1)return --cnt[rt],up(rt),(void)(0); |
| if(!son[rt][0]&&!son[rt][1])return clear(rt),rt=0,(void)0; |
| if(!son[rt][0]){ |
| int now=rt;rt=son[rt][1];fa[rt]=0;clear(now);return; |
| } |
| if(!son[rt][1]){ |
| int now=rt;rt=son[rt][0];fa[rt]=0;clear(now);return; |
| } |
| int now=rt,x=pre(); |
| fa[son[now][1]]=x;son[x][1]=son[now][1]; |
| clear(now);up(rt); |
| } |
| }tr; |
| struct jj{ |
| int son[N][2],sz[N],v[N],id[N],tot,rt; |
| inline void up(int x){sz[x]=sz[son[x][0]]+sz[son[x][1]]+1;} |
| inline int ne(int x){return sz[++tot]=1,v[tot]=x,id[tot]=rand(),tot;} |
| inline int he(int x,int y){ |
| if(!x||!y)return x^y; |
| if(id[x]<id[y]){return son[x][1]=he(son[x][1],y),up(x),x;} |
| return son[y][0]=he(x,son[y][0]),up(y),y; |
| } |
| inline void fen(int now,int k,int &x,int &y){ |
| if(!now)x=y=0; |
| else{ |
| if(k>=v[now])x=now,fen(son[now][1],k,son[now][1],y); |
| else y=now,fen(son[now][0],k,x,son[now][0]); |
| up(now); |
| } |
| } |
| inline int kth(int now,int k){ |
| while(1){ |
| if(k<=sz[son[now][0]])now=son[now][0]; |
| else if(k==sz[son[now][0]]+1)return now; |
| else k-=sz[son[now][0]]+1,now=son[now][1]; |
| } |
| } |
| inline void ins(int k){ |
| int x,y; |
| fen(rt,k,x,y),rt=he(he(x,ne(k)),y); |
| } |
| inline void del(int k){ |
| int x,y,z; |
| fen(rt,k,x,y),fen(x,k-1,x,z); |
| z=he(son[z][0],son[z][1]),rt=he(he(x,z),y); |
| } |
| inline int rk(int k){ |
| int x,y,ans; |
| fen(rt,k-1,x,y);ans=sz[x]+1; |
| return rt=he(x,y),ans; |
| } |
| inline int pre(int k){ |
| int x,y,ans; |
| fen(rt,k-1,x,y);ans=v[kth(x,sz[x])]; |
| return rt=he(x,y),ans; |
| } |
| inline int nxt(int k){ |
| int x,y,ans; |
| fen(rt,k,x,y);ans=v[kth(y,1)]; |
| return rt=he(x,y),ans; |
| } |
| }tr[2]; |
终于知道什么是
闲言少叙,开始摞码
| struct jj{ |
| int son[N][2],sz[N],tot,rt,id[N],v[N]; |
| |
| |
| |
| |
| |
| |
| inline void up(int x){sz[x]=sz[son[x][0]]+sz[son[x][1]]+1;} |
| inline int ne(int x){return sz[++tot]=1,v[tot]=x,id[tot]=rand(),tot;} |
| }tr[2]; |
| inline int he(int x,int y){ |
| if(!x||!y)return x^y; |
| if(id[x]<id[y])return son[x][1]=he(son[x][1],y),up(x),x; |
| return son[y][0]=he(x,son[y][0]),up(y),y; |
| } |
| inline void fen(int now,int k,int &x,int &y){ |
| if(!now)x=y=0; |
| else{ |
| if(k>=v[now])x=now,fen(son[now][1],k,son[now][1],y); |
| else y=now,fen(son[now][0],k,x,son[now][0]); |
| up(now); |
| } |
| } |
| inline void ins(int k){ |
| int x,y; |
| fen(rt,k,x,y),rt=he(he(x,ne(k)),y); |
| } |
| inline void del(int k){ |
| int x,y,z; |
| fen(rt,k,x,y),fen(x,k-1,x,z); |
| z=he(son[z][0],son[z][1]),rt=he(he(x,z),y); |
| } |
| inline int kth(int now,int k){ |
| while(1){ |
| if(k<=sz[son[now][0]])now=son[now][0]; |
| else if(k==sz[son[now][0]]+1)return now; |
| else k-=sz[son[now][0]]+1,now=son[now][1]; |
| } |
| } |
| inline int rk(int k){ |
| int x,y,ans; |
| fen(rt,k-1,x,y);ans=sz[x]+1; |
| return rt=he(x,y),ans; |
| } |
| inline int pre(int k){ |
| int x,y,ans; |
| fen(rt,k-1,x,y);ans=v[kth(x,sz[x])]; |
| return rt=he(x,y),ans; |
| } |
| inline int nxt(int k){ |
| int x,y,ans; |
| fen(rt,k,x,y);ans=v[kth(y,1)]; |
| return rt=he(x,y),ans; |
| } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章