Cod sursa(job #2875975)

Utilizator hhhhhhhAndrei Boaca hhhhhhh Data 22 martie 2022 19:18:06
Problema Zeap Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 5.23 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,valmin,valmax,data,pri,lg;
    Treap* lft,*rgt;
    Treap(int val)
    {
        lg=1;
        data=val;
        pri=rng();
        lft=NULL;
        rgt=NULL;
        mind=2e9;
        valmin=val;
        valmax=val;
    }
};
Treap* t;
int size(Treap* me)
{
    if(me==NULL)
        return 0;
    return me->lg;
}
void recalc(Treap* me)
{
    if(me==NULL)
        return;
    if(me->lft!=NULL&&me->rgt!=NULL)
    {
        me->lg=me->lft->lg+me->rgt->lg+1;
        me->valmin=min(me->data,min(me->lft->valmin,me->rgt->valmin));
        me->valmax=max(me->data,max(me->lft->valmax,me->rgt->valmax));
        me->mind=min(me->lft->mind,me->rgt->mind);
        me->mind=min(me->mind,me->data-me->lft->valmax);
        me->mind=min(me->mind,me->rgt->valmin-me->data);
    }
    if(me->lft!=NULL&&me->rgt==NULL)
    {
        me->lg=me->lft->lg+1;
        me->valmin=min(me->data,me->lft->valmin);
        me->valmax=max(me->data,me->lft->valmax);
        me->mind=me->lft->mind;
        me->mind=min(me->mind,me->data-me->lft->valmax);
    }
    if(me->lft==NULL&&me->rgt!=NULL)
    {
        me->lg=me->rgt->lg+1;
        me->valmin=min(me->data,me->rgt->valmin);
        me->valmax=max(me->data,me->rgt->valmax);
        me->mind=me->rgt->mind;
        me->mind=min(me->mind,me->rgt->valmin-me->data);
    }
    if(me->lft==NULL&&me->rgt==NULL)
    {
        me->lg=1;
        me->valmin=me->valmax=me->data;
        me->mind=2e9;
    }
}
array<Treap*,2> split(Treap* me, int key)
{
    if(me==NULL)
        return {NULL,NULL};
    if(me->data<key)
    {
        array<Treap*,2> a=split(me->rgt,key);
        Treap* l=me;
        Treap* r=a[1];
        l->rgt=a[0];
        recalc(l);
        recalc(r);
        return {l,r};
    }
    else
    {
        array<Treap*,2> a=split(me->lft,key);
        Treap* l=a[0];
        Treap* r=me;
        r->lft=a[1];
        recalc(l);
        recalc(r);
        return {l,r};
    }
}
array<Treap*,2> splitrange(Treap* me, int nr)
{
    if(me==NULL)
        return {NULL,NULL};
    if(nr==0)
        return {NULL,me};
    if(nr==me->lg)
        return {me,NULL};
    if(size(me->lft)<nr)
    {
        int X=size(me->lft);
        array<Treap*,2> a=splitrange(me->rgt,nr-X-1);
        Treap* l=me;
        l->rgt=a[0];
        Treap* r=a[1];
        recalc(l);
        recalc(r);
        return {l,r};
    }
    else
    {
        array<Treap*,2> a=splitrange(me->lft,nr);
        Treap* l=a[0];
        Treap* r=me;
        r->lft=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->rgt=merge(a->rgt,b);
        recalc(rez);
        return rez;
    }
    else
    {
        Treap* rez=b;
        rez->lft=merge(a,b->lft);
        recalc(rez);
        return rez;
    }
}
void putin(int val)
{
    Treap* nod=new Treap(val);
    if(t==NULL)
    {
        t=nod;
        return;
    }
    array<Treap*,2> a=split(t,val);
    t=a[0];
    t=merge(t,nod);
    t=merge(t,a[1]);
}
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=1;
    t=a[0];
    t=merge(t,b[1]);
    return found;
}
int getmin(int l,int r)
{
    if(r-l+1==1)
        return -1;
    array<Treap*,2> a=splitrange(t,l-1);
    array<Treap*,2> b=splitrange(a[1],r-l+1);
    int rez=b[0]->mind;
    t=merge(b[0],b[1]);
    t=merge(a[0],t);
    return rez;
}
int getmax(int l,int r)
{
    if(r-l+1==1)
        return -1;
    array<Treap*,2> a=splitrange(t,l-1);
    array<Treap*,2> b=splitrange(a[1],r-l+1);
    int rez=b[0]->valmax-b[0]->valmin;
    t=merge(b[0],b[1]);
    t=merge(a[0],t);
    return rez;
}
int main()
{
    ios_base::sync_with_stdio(false);
    fin.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 ok=0;
            if(x==3)
                ok=1;
            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")
        {
            fout<<t->valmax-t->valmin<<'\n';
            continue;
        }
        if(tip=="MIN")
        {
            fout<<t->mind<<'\n';
            continue;
        }
    }
    return 0;
}