Cod sursa(job #2715542)

Utilizator alexdumitrescuDumitrescu George Alex alexdumitrescu Data 3 martie 2021 20:11:12
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.89 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());
char c;
int x;
struct treap
{
    int k, p, maxx, minn, mind;
    treap *l, *r;

    treap(int x)
    {
        k=x;
        p=rng();
        minn = maxx = x;
        mind=INT_MAX;
        l=NULL;
        r=NULL;
    }
}*rad;

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

    rt->maxx = rt->k;
    rt->minn = rt->k;
    rt->mind = INT_MAX;

    if(rt->r)
    {
        rt->maxx = rt->r->maxx;
        rt->mind = min(rt->mind, min(rt->r->mind, rt->r->minn - rt->k));
    }
    if(rt->l)
    {
        rt->minn = rt->l->minn;
        rt->mind = min(rt->mind, min(rt->l->mind, rt->k - rt->l->maxx));
    }
}

void split(treap *rt, int key, treap *&l, treap *&r)
{
    if(!rt)
    {
        l=r=NULL;
        return;
    }
    if(key < rt->k)
    {
        split(rt->l, key, l, rt->l);
        r=rt;
    }
    else
    {
        split(rt->r, key, rt->r, r);
        l=rt;
    }
    upd(rt);
}

void merg(treap *&rt, treap *l, treap *r)
{
    if(!l)
    {
        rt=r;
        return;
    }
    if(!r)
    {
        rt=l;
        return;
    }

    if(l->p > r->p)
    {
        merg(l->r, l->r, r);
        rt=l;
    }
    else
    {
        merg(r->l, l, r->l);
        rt=r;
    }
    upd(rt);
}

void ins(treap *&rt, treap *elem)
{
    treap *l, *r;
    split(rt, elem->k, l, r);
    merg(l, l, elem);
    merg(rt, l, r);
}

void del(treap *&rt, int key)
{
    if(key == rt->k)
    {
        treap *aux = rt;
        merg(rt, rt->l, rt->r);
        delete aux;
    }
    else if(key<rt->k)
        del(rt->l, key);
    else del(rt->r, key);
    upd(rt);
}

bool caut(treap *rt, int key)
{
    if(!rt)
        return 0;
    if(key==rt->k)
        return 1;
    if(key<rt->k)
        return caut(rt->l, key);
    return caut(rt->r, key);
}

int main()
{
    treap *rt=NULL;
    while(fin >> c)
    {
        if(c=='I')
        {
            fin >> x;
            if(!caut(rt, x))
            {
                treap *t = new treap(x);
                ins(rt, t);
            }
        }
        else if(c=='S')
        {
            fin >> x;
            if(caut(rt, x))
                del(rt, x);
            else fout << -1 << '\n';
        }
        else if(c=='C')
        {
            fin >> x;
            fout << caut(rt, x) << '\n';
        }
        else
        {
            char c1, c2;
            fin >> c1 >> c2;
            if(rt==NULL || (rt->maxx==rt->minn))
                fout << -1 << '\n';
            else
            {
                if(c1=='A')
                    fout << rt->maxx - rt->minn << '\n';
                else fout << rt->mind << '\n';
            }
        }
    }
    return 0;
}