#include<bits/stdc++.h> using namespace std; const int N=100000; const int inf=2147483647; int cnt=0; int top=0; struct treap{ int ch[2],size,rd,val; }t[N+10]; int gi(){ int ans=0,f=1;char i=getchar(); while(i<‘0‘||i>‘9‘){if(i==‘-‘)f=-1;i=getchar();} while(i>=‘0‘&&i<=‘9‘){ans=ans*10+i-‘0‘;i=getchar();} return ans*f; } void up(int i){ t[i].size=t[t[i].ch[0]].size+t[t[i].ch[1]].size+1; } int rotate(int i,int dir){ int child=t[i].ch[dir]; t[i].ch[dir]=t[child].ch[dir^1]; t[child].ch[dir^1]=i; up(i);up(child); return child; } int insert(int i,int val){ if(!i){ t[++cnt].rd=rand(); t[cnt].val=val; t[cnt].size=1; return cnt; } t[i].size++; bool dir=t[i].val<=val; t[i].ch[dir]=insert(t[i].ch[dir],val); if(t[i].rd>t[t[i].ch[dir]].rd) return rotate(i,dir); return i; } int pre_rank(int i,int val){ if(!i)return -1; if(val==t[i].val) { int ans=pre_rank(t[i].ch[0],val); return ans==-1?i:ans; } if(t[i].val>val) return pre_rank(t[i].ch[0],val); return pre_rank(t[i].ch[1],val); } int get_rank(int i,int j,int val){ if(i==j)return t[t[i].ch[0]].size+1; if(t[i].val>=val) return get_rank(t[i].ch[0],j,val); return get_rank(t[i].ch[1],j,val)+t[t[i].ch[0]].size+1; } int kth(int i,int k){ if(t[t[i].ch[0]].size==k-1) return t[i].val; if(t[t[i].ch[0]].size>=k) return kth(t[i].ch[0],k); return kth(t[i].ch[1],k-t[t[i].ch[0]].size-1); } int delet(int i,int val){ if(t[i].val==val) { if(t[i].ch[0]&&t[i].ch[1]) { int son=t[i].ch[0],fa; while(t[son].ch[1]) fa=son,son=t[son].ch[1],t[fa].size--; if(son==t[i].ch[0]) { t[son].ch[1]=t[i].ch[1]; t[son].rd=t[i].rd; t[son].size=t[i].size-1; return son; } t[fa].ch[1]=t[son].ch[0]; t[son].ch[0]=t[i].ch[0]; t[son].ch[1]=t[i].ch[1]; t[son].rd=t[i].rd; t[son].size=t[i].size-1; return son; } if(t[i].ch[0]) return t[i].ch[0]; return t[i].ch[1]; } int dir=t[i].val<val; t[i].ch[dir]=delet(t[i].ch[dir],val); t[i].size--; return i; } int get_pre(int i,int val){ if(!i) return -inf; if(t[i].val<val) return max(t[i].val,get_pre(t[i].ch[1],val)); return get_pre(t[i].ch[0],val); } int get_next(int i,int val){ if(!i) return inf; if(t[i].val>val) return min(t[i].val,get_next(t[i].ch[0],val)); return get_next(t[i].ch[1],val); } int main(){ srand(time(NULL)); int opt = gi() , flag , x ; for(int i=1;i<=opt;i++){ flag=gi(); x=gi(); switch(flag){ case 1:top=insert(top,x);break; case 2:top=delet(top,x);break; case 3:printf("%d\n",get_rank(top,pre_rank(top,x),x));break; case 4:printf("%d\n",kth(top,x));break; case 5:printf("%d\n",get_pre(top,x));break; case 6:printf("%d\n",get_next(top,x));break; } } return 0; }
原文地址:https://www.cnblogs.com/Lumberjack/p/8284345.html
时间: 2024-11-08 15:13:10