Cod sursa(job #2671838)

Utilizator Chirac_MateiChiriac Matei Chirac_Matei Data 12 noiembrie 2020 18:55:40
Problema Zeap Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.01 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin ("zeap.in");
ofstream fout ("zeap.out");

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
struct treap
{
    int val, pri;
    int maxi,mini,mind;
    treap *l=nullptr, *r=nullptr;

    treap(int val)
    {
        this->val=val;
        maxi=val;
        mini=val;
        mind=2e9;

        pri=rng();
    }
};

void upd(treap *p)
{
    if(!p)
        return;

    p->maxi=p->val;
    p->mini=p->val;
    p->mind=2e9;

    if(p->r)
    {
        p->maxi=p->r->maxi;
        p->mind=min(p->mind, p->r->mind);
        p->mind=min(p->mind, p->r->mini - p->val);
    }
    if(p->l)
    {
        p->mini=p->l->mini;
        p->mind=min(p->mind, p->l->mind);
        p->mind=min(p->mind, p->val - p->l->maxi);
    }
}
void split(int val, treap *p, treap *&l, treap *&r)
{
    if(!p)
    {
        l=r=nullptr;
        return;
    }

    if(p->val<=val)
    {
        l=p;
        split(val, p->r, p->r, r);
    }
    else
    {
        r=p;
        split(val, p->l, l, p->l);
    }

    upd(l);
    upd(r);
}
void mergef(treap *&p, treap *l, treap *r)
{
    if(!r)
    {
        p=l;
        return;
    }
    if(!l)
    {
        p=r;
        return;
    }

    if(l->pri > r->pri)
    {
        p=l;
        mergef(p->r, p->r, r);
    }
    else
    {
        p=r;
        mergef(p->l, l, p->l);
    }

    upd(p);
}
void add(int x, treap *&p)
{
    treap *l, *r, *mij;

    split(x-1, p, l, r);
    split(x, r, mij, r);

    if(mij)
        return;

    mij=new treap(x);

    mergef(l, l, mij);
    mergef(p, l, r);
}
bool del(int x, treap *&p)
{
    treap *l, *r, *mij;

    split(x-1, p, l, r);
    split(x, r, mij, r);

    bool ok=true;
    if(!mij)
        ok=false;

    mergef(p, l, r);
    return ok;
}
bool caut(int x, treap *&p)
{
    treap *l, *r, *mij;

    split(x-1, p, l, r);
    split(x, r, mij, r);

    bool ok;
    if(mij)
        ok=true;
    else
        ok=false;

    mergef(l, l, mij);
    mergef(p, l, r);

    return ok;
}
int maxdif(treap *p)
{
    if(!p || p->mini==p->maxi)
    {
        return -1;
    }

    return p->maxi - p->mini;
}
int mindif(treap *p)
{
    if(!p || p->mind==2e9)
    {
        return -1;
    }

    return p->mind;
}
int main()
{
    char t;
    int nr;

    treap *root=nullptr;
    while(true)
    {
        string s;
        getline(cin, s);

        if(s.empty())
            break;

        if(s=="MAX")
        {
            cout<<maxdif(root)<<'\n';
            continue;
        }
        if(s=="MIN")
        {
            cout<<mindif(root)<<'\n';
            continue;
        }

        istringstream iss(s);

        iss>>t>>nr;

        if(t=='I')
            add(nr, root);
        if(t=='S')
            if(!del(nr, root))
                cout<<"-1\n";
        if(t=='C')
            cout<<caut(nr, root)<<'\n';
    }
    return 0;
}