【treap】【bzoj 3224】: Tyvj 1728 普通平衡树

来源:互联网 发布:速卖通数据分析 编辑:程序博客网 时间:2024/04/30 02:31


加上了前驱和后继


//#define _TEST _TEST#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <cmath>#include <algorithm>using namespace std;/************************************************Code By willinglive    Blog:http://willinglive.cf************************************************/#define rep(i,l,r) for(int i=l,___t=(r);i<=___t;i++)#define per(i,r,l) for(int i=r,___t=(l);i>=___t;i--)#define MS(arr,x) memset(arr,x,sizeof(arr))#define LL long long#define INE(i,u,e) for(int i=head[u];~i;i=e[i].next)#define LS T[o].l#define RS T[o].rinline const int getint(){    int r=0,k=1;char c=getchar();    for(;c<'0'||c>'9';c=getchar())if(c=='-')k=-1;    for(;c>='0'&&c<='9';c=getchar())r=r*10+c-'0';    return k*r;}/////////////////////////////////////////////////int n,root,sz,ans;struct data{int l,r,s,cnt,rnd,w;}T[100001];/////////////////////////////////////////////////void update(int o){T[o].s=T[LS].s+T[RS].s+T[o].cnt;}void r_rot(int &o){int t=LS;LS=T[t].r;T[t].r=o;T[t].s=T[o].s;update(o);o=t;}void l_rot(int &o){int t=RS;RS=T[t].l;T[t].l=o;T[t].s=T[o].s;update(o);o=t;}void insert(int &o,int x){if(o==0){o=++sz;T[o].s=T[o].cnt=1;T[o].rnd=rand()*rand();T[o].w=x;return;}T[o].s++;if(x<T[o].w){insert(LS,x);if(T[o].rnd>T[LS].rnd) r_rot(o);}else if(x>T[o].w){insert(RS,x);if(T[o].rnd>T[RS].rnd) l_rot(o);}else T[o].cnt++;}void del(int &o,int x){if(o==0)return;if(T[o].w==x){if(T[o].cnt>1) T[o].s--,T[o].cnt--;else if(LS==0||RS==0)o=LS+RS;else if(T[LS].rnd<T[RS].rnd) r_rot(o),del(o,x);else l_rot(o),del(o,x);return;}T[o].s--;if(T[o].w<x) del(RS,x);else del(LS,x);}int getrank(int o,int x){if(o==0) return 0;if(T[o].w==x) return T[LS].s+1;else if(T[o].w<x) return T[LS].s+T[o].cnt+getrank(RS,x);else return getrank(LS,x);}int getnum(int o,int x){if(o==0) return 0;if(x<=T[LS].s) return getnum(LS,x);else if(x>T[LS].s+T[o].cnt) return getnum(RS,x-T[LS].s-T[o].cnt);else return T[o].w;}void getbefore(int o,int x){if(o==0) return;if(T[o].w<x) ans=T[o].w,getbefore(RS,x);else getbefore(LS,x);}void getafter(int o,int x){if(o==0) return;if(T[o].w>x) ans=T[o].w,getafter(LS,x);else getafter(RS,x);}/////////////////////////////////////////////////void input(){srand(13131);    scanf("%d",&n);}void solve(){int op;int x;    while(n--)    {    scanf("%d%d",&op,&x);    if(op==1) insert(root,x);    else if(op==2) del(root,x);    else if(op==3) printf("%d\n",getrank(root,x));    else if(op==4) printf("%d\n",getnum(root,x));    else if(op==5) ans=0,getbefore(root,x),printf("%d\n",ans);    else if(op==6) ans=0,getafter(root,x),printf("%d\n",ans);    }}/////////////////////////////////////////////////int main(){    #ifndef _TEST    freopen("std.in","r",stdin); freopen("std.out","w",stdout);    #endif    input();    solve();    return 0;}


0 0
原创粉丝点击