Cod sursa(job #2875999)

Utilizator hhhhhhhAndrei Boaca hhhhhhh Data 22 martie 2022 20:03:35
Problema Zeap Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.73 kb
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
ifstream fin("zeap.in");
ofstream fout("zeap.out");
mt19937 rng(time(NULL));
struct Treap
{
    int mind,valmax,valmin,data,lg,pri;
    Treap* kids[2];
    Treap(int val)
    {
        data=val;
        lg=1;
        pri=rng();
        valmax=data;
        valmin=data;
        mind=2e9;
        kids[0]=NULL;
        kids[1]=NULL;
    }
};
Treap* t=NULL;
int size(Treap* me)
{
    if(me==NULL)
        return 0;
    return me->lg;
}
void recalc(Treap* me)
{
    if(me==NULL)
        return;
    me->lg=size(me->kids[0])+size(me->kids[1])+1;
    me->valmax=me->data;
    me->valmin=me->data;
    me->mind=2e9;
    if(me->kids[0]!=NULL)
    {
        me->valmax=max(me->valmax,me->kids[0]->valmax);
        me->valmin=min(me->valmin,me->kids[0]->valmin);
        me->mind=min(me->mind,me->kids[0]->mind);
        me->mind=min(me->mind,abs(me->data-me->kids[0]->valmax));
        me->mind=min(me->mind,abs(me->data-me->kids[0]->valmin));
    }
    if(me->kids[1]!=NULL)
    {
        me->valmax=max(me->valmax,me->kids[1]->valmax);
        me->valmin=min(me->valmin,me->kids[1]->valmin);
        me->mind=min(me->mind,me->kids[1]->mind);
        me->mind=min(me->mind,abs(me->data-me->kids[1]->valmax));
        me->mind=min(me->mind,abs(me->data-me->kids[1]->valmin));
    }
}
array<Treap*,2> split(Treap* me,int key)
{
    if(me==NULL)
        return {NULL,NULL};
    if(me->data<key)
    {
        array<Treap*,2> a=split(me->kids[1],key);
        Treap* l=me;
        l->kids[1]=a[0];
        Treap* r=a[1];
        recalc(l);
        recalc(r);
        return {l,r};
    }
    else
    {
        array<Treap*,2> a=split(me->kids[0],key);
        Treap* l=a[0];
        Treap* r=me;
        r->kids[0]=a[1];
        recalc(l);
        recalc(r);
        return {l,r};
    }
}
Treap* merge(Treap* a, Treap* b)
{
    if(a==NULL)
        return b;
    if(b==NULL)
        return a;
    if(a->pri>b->pri)
    {
        Treap* rez=a;
        rez->kids[1]=merge(a->kids[1],b);
        recalc(rez);
        return rez;
    }
    else
    {
        Treap* rez=b;
        rez->kids[0]=merge(a,b->kids[0]);
        recalc(rez);
        return rez;
    }
}
Treap* putout(Treap* me,int val)
{
    if(me==NULL)
        return me;
    if(me->data==val)
    {
        Treap* rez=merge(me->kids[0],me->kids[1]);
        delete me;
        return rez;
    }
    if(me->data<val)
    {
        me->kids[1]=putout(me->kids[1],val);
        recalc(me);
        return me;
    }
    if(me->data>val)
    {
        me->kids[0]=putout(me->kids[0],val);
        recalc(me);
        return me;
    }
}
Treap* putin(Treap* me,Treap* nod)
{
    if(me==NULL)
        return nod;
    if(me->data<nod->data)
    {
        if(nod->pri<me->pri)
        {
            me->kids[1]=putin(me->kids[1],nod);
            recalc(me);
            return me;
        }
        else
        {
            nod->kids[0]=me;
            recalc(nod);
            return nod;
        }
    }
    if(me->data>nod->data)
    {
        if(nod->pri<me->pri)
        {
            me->kids[0]=putin(me->kids[0],nod);
            recalc(me);
            return me;

        }
        else
        {
            nod->kids[1]=me;
            recalc(nod);
            return nod;
        }
    }
}
int main()
{
    ios_base::sync_with_stdio(false);
    fin.tie(0);
    fout.tie(0);
    string tip;
    while(fin>>tip)
    {
        if(tip=="I")
        {
            int x;
            fin>>x;
            t=putout(t,x);
            Treap* nod=new Treap(x);
            t=putin(t,nod);
            continue;
        }
        if(tip=="S")
        {
            int x;
            fin>>x;
            int prvlg=size(t);
            t=putout(t,x);
            if(size(t)==prvlg)
                fout<<-1<<'\n';
            continue;
        }
        if(tip=="C")
        {
            int x;
            fin>>x;
            int prvlg=size(t);
            t=putout(t,x);
            if(size(t)!=prvlg)
            {
                fout<<1<<'\n';
                Treap* nod=new Treap(x);
                t=putin(t,nod);
            }
            else
                fout<<0<<'\n';
            continue;
        }
        if(tip=="MAX")
        {
            if(size(t)<2)
                fout<<-1<<'\n';
            else
                fout<<t->valmax-t->valmin<<'\n';
            continue;
        }
        if(tip=="MIN")
        {
            if(size(t)<2)
                fout<<-1<<'\n';
            else
                fout<<t->mind<<'\n';
            continue;
        }
    }
    return 0;
}