Cod sursa(job #2671713)

Utilizator Chirac_MateiChiriac Matei Chirac_Matei Data 12 noiembrie 2020 16:44:40
Problema Zeap Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.93 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)
{
    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(p);
}
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);
}
void del(int x, treap *&p)
{
    treap *l, *r, *mij;

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

    if(!mij)
        fout<<"-1\n";

    mergef(p, l, r);
}
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;
}
void maxdif(treap *p)
{
    if(!p || p->mini==p->maxi)
    {
        fout<<"-1\n";
        return;
    }

    fout<<p->maxi - p->mini<<'\n';
}
void mindif(treap *p)
{
    if(!p || p->mind==2e9)
    {
        fout<<"-1\n";
        return;
    }

    fout<<p->mind<<'\n';
}
int main()
{
    char t;
    int nr;

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

        if(s.empty())
            break;

        if(s=="MAX")
        {
            maxdif(root);
            continue;
        }
        if(s=="MIN")
        {
            mindif(root);
            continue;
        }

        istringstream iss(s);

        iss>>t>>nr;

        if(t=='I')
            add(nr, root);
        if(t=='S')
            del(nr, root);
        if(t=='C')
            fout<<caut(nr, root)<<'\n';
    }
    return 0;
}