FHQtreap(我有个绝妙的理解方法,但课的时间不够[doge])

会了FHQ,treap什么的就忘了吧……

#include
using namespace std;
struct FHQ
{
    int v,w,size,l,r;
}t[300005];
int root,k,n,_min,tot,add,x,y,ans,cnt;
char ch;
int newnode(int k)
{
    ++tot;
    if(!root)root=1;
    t[tot].size=1,t[tot].v=k,t[tot].w=rand();
    return tot;
}
void update(int now)
{
    t[now].size=t[t[now].l].size+t[t[now].r].size+1;
}
int merge(int x,int y)
{
    if(!x||!y)return x+y;
    if(t[x].w<t[y].w)
    {
        t[x].r=merge(t[x].r,y);
        update(x);
        return x;
    }
    else
    {
        t[y].l=merge(x,t[y].l);
        update(y);
        return y;
    }
}
void split(int now,int val,int &x,int &y)
{
    if(!now){x=y=0;return;}
    if(t[now].v<val)
    {
        x=now;
        split(t[now].r,val,t[now].r,y);
    }
    else
    {
        y=now;
        split(t[now].l,val,x,t[now].l);
    }
    update(now);
}
void change(int now,int k)
{
    if(!now)return;
    t[now].v+=k;
    change(t[now].l,k);
    change(t[now].r,k);
}
int find(int now,int k)
{
    if(t[t[now].l].size==k-1)return now;
    if(t[t[now].l].size>k-1)return find(t[now].l,k);
    if(t[t[now].l].size1)return find(t[now].r,k-t[t[now].l].size-1);
}
void pp()
{
    cout<endl;
    for(int i=1;i2)<' ';
    cout<<endl;
    for(int i=1;i2)<' ';
    cout<<endl;
    for(int i=1;i2)<' ';
    cout<<endl;
    for(int i=1;i2)<' ';
    cout<<endl;
    for(int i=1;i2)<' ';
    cout<endl;
}
int main()
{
    srand(114514);
    cin>>n>>_min;
    for(int i=1;i)
    {
        cin>>ch;
        if(ch=='I')
        {
            cin>>k;
            if(k<_min>continue;
            split(root,k,x,y);
            root=merge(merge(x,newnode(k)),y);
        }
        if(ch=='A')
        {
            cin>>k;
            change(root,k);
        }
        if(ch=='S')
        {
            cin>>k;
            change(root,-k);
            split(root,_min,x,y);
            ans+=t[x].size;
            root=y;
        }
        if(ch=='F')
        {
            cin>>k;
            if(t[root].size<k)
            {
                cout<1<<endl;
                continue;
            }
            cout<1)].v<<endl;
        }
        ///pp();
    }
    cout<<ans;
    return 0;
}[find(root,tot-ans-k+[i].size[i].r[i].l[i].v

Original: https://www.cnblogs.com/29taorz/p/15305384.html
Author: T_X蒻
Title: FHQtreap(我有个绝妙的理解方法,但课的时间不够[doge])

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/584345/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球