Cod sursa(job #2875986)

Utilizator hhhhhhhAndrei Boaca hhhhhhh Data 22 martie 2022 19:33:14
Problema Zeap Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.99 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;
    }
}
bool putout(int val)
{
    if(t==NULL)
        return 0;
    array<Treap*,2> a=split(t,val);
    array<Treap*,2> b=split(a[1],val+1);
    bool found=0;
    if(b[0]==NULL)
        found=0;
    else
    {
        found=1;
        delete b[0];
    }
    t=merge(a[0],b[1]);
    return found;
}
void putin(int val)
{
    Treap* nod=new Treap(val);
    array<Treap*,2> a=split(t,val);
    array<Treap*,2> b=split(a[1],val+1);
    t=merge(a[0],nod);
    t=merge(t,b[1]);
}
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;
            putout(x);
            putin(x);
            continue;
        }
        if(tip=="S")
        {
            int x;
            fin>>x;
            bool found=putout(x);
            if(!found)
                fout<<-1<<'\n';
            continue;
        }
        if(tip=="C")
        {
            int x;
            fin>>x;
            bool ok=0;
            if(x==1)
                ok=1;
            bool found=putout(x);
            if(found)
            {
                fout<<1<<'\n';
                putin(x);
            }
            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;
}