无旋treap

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define P pair<int,int>
#define ls(x) T[x].ls
#define rs(x) T[x].rs
using namespace std;
struct Treenode
{
    int val,ls,rs,size;
    int rnd;
}T[100010];
int cnt,n,rt;
int ran()
{
    static int seed=20172101;
    seed+=(seed<<2)+1;
    return seed;
}
void update(int a)
{
    T[a].size=T[ls(a)].size+T[rs(a)].size+1;
}
int merge(int a,int b) //maxa<minnb
{
    if(a==0)return b;
    if(b==0)return a;
    if(T[a].rnd<T[b].rnd) {T[a].rs=merge(T[a].rs,b);update(a);return a;}
    else {T[b].ls=merge(a,T[b].ls);update(b);return b;}
}
P split(int a,int n)
{
    if(n==0) return make_pair(0,a);
    int L=ls(a),R=rs(a);
    if(n==T[L].size) {T[a].ls=0;update(a);return make_pair(L,a);}
    if(n==T[L].size+1) {T[a].rs=0;update(a);return make_pair(a,R);}
    if(n<T[L].size)
    {
        P tmp=split(L,n);
        T[a].ls=tmp.second;update(a);return make_pair(tmp.first,a);
    }
    P tmp=split(R,n-T[L].size-1);
    T[a].rs=tmp.first;update(a);return make_pair(a,tmp.second);
}
int rank(int x,int rt)
{
    int ans=0,tp=2147483233;
    while(rt)
    {
        if(T[rt].val==x) tp=min(tp,ans+T[ls(rt)].size+1);
        if(T[rt].val<x) {ans+=T[ls(rt)].size+1;rt=rs(rt);}
        else rt=ls(rt);
    }
    return tp==2147483233?ans:tp;
}
int find(int x,int rt)
{
    while(1)
    {
       if(T[ls(rt)].size==x-1) return T[rt].val;
       if(T[ls(rt)].size>x-1) rt=ls(rt);
       else {x=x-T[ls(rt)].size-1;rt=rs(rt);}
    }
}
int pre(int x,int k)
{
    int ans=-(int)1e9;
    while(k)
    {
        if(T[k].val<x) {ans=max(ans,T[k].val);k=rs(k);}
        else k=ls(k);
    }
    return ans;
}
int suf(int x,int k)
{
    int ans=(int)1e9;
    while(k)
    {
        if(T[k].val>x) {ans=min(ans,T[k].val);k=ls(k);}
        else k=rs(k);    
    }    
    return ans;
}
int add(int x)
{
    int k=rank(x,rt);
    P tmp=split(rt,k);
    T[++cnt].val=x;
    T[cnt].rnd=ran();
    T[cnt].size=1;
    rt=merge(tmp.first,cnt);
    rt=merge(rt,tmp.second);
}
int del(int x)
{
    int k=rank(x,rt);
    P t1=split(rt,k);
    P t2=split(t1.first,k-1);
    rt=merge(t2.first,t1.second);
}
int main()
{
    scanf("%d",&n);
    rt=0;
    while(n--)
    {
        int opt,x;
        scanf("%d%d",&opt,&x);
        if(opt==1)
            add(x);
        if(opt==2)
            del(x);
        if(opt==3)
            printf("%d
",rank(x,rt));
        if(opt==4)
            printf("%d
",find(x,rt));
        if(opt==5)
            printf("%d
",pre(x,rt));
        if(opt==6)
            printf("%d
",suf(x,rt));
    }
}
无旋treap(luogu3369)
原文地址:https://www.cnblogs.com/wjxgy/p/7921312.html