Cod sursa(job #1980087)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 12 mai 2017 11:16:50
Problema Zeap Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.91 kb
#include <fstream>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <ctime>
#define inf 1e9
using namespace std;

ifstream f("zeap.in");
ofstream g("zeap.out");

struct treap{
    int key,pr,mx,mn,mndif;
    treap *st, *dr;

    treap(int _key,int _pr) : key(_key) , pr(_pr) {mn = mx = key; st = dr = NULL;}

    void update()
    {
        if (this == NULL)
            return;
        mndif = inf;
        mn = mx = key;
        if (dr!=NULL)
        {
            mx = max(mx,dr->mx);
            mn = min(mn,dr->mn);
            mndif = dr->mndif;
        }
        if (st!=NULL)
        {
            mx = max(mx,st->mx);
            mn = min(mn,st->mn);
            mndif = min(mndif,st->mndif);
        }
        mndif = min(mndif,min(st!=NULL? key - st->mx : (int)inf,dr!=NULL ? dr->mn - key : (int)inf));
    }
}*T;

int nr,x;
string s;

void split(treap *T, int key, treap *&l, treap *&r)
{
    if (T==NULL)
        l = r = NULL;
    else if (T->key>=key)
        split(T->st,key,l,T->st),r = T;
    else
        split(T->dr,key,T->dr,r),l = T;
    T->update();
}

void merge(treap *&T,treap *l,treap *r)
{
    if (l==NULL)
        T = r;
    else if (r==NULL)
        T = l;
    else if (l->pr>r->pr)
        merge(l->dr,l->dr,r),T = l;
    else
        merge(r->st,l,r->dr),T = r;
    T->update();
}

void insert(treap *&T,treap *x)
{
    if (T==NULL)
        T = x;
    else if (x->pr > T->pr)
        split(T,x->key,x->st,x->dr),T = x;
    else if(x->key < T->key)
        insert(T->st,x);
    else
        insert(T->dr,x);
    T->update();
}

int erase(treap *&T,int key)
{
    int x;
    if (T == NULL)
        return 1;
    if (T->key==key)
    {
        merge(T,T->st,T->dr);
        return 0;
    }
    else if(T->key>key)
        x = erase(T->st,key);
    else
        x = erase(T->dr,key);
    T->update();
    return x;
}

int search(treap *&T,int key)
{
    if (T==NULL)
        return 0;
    if (T->key==key)
        return 1;
    if (T->key>key)
        return search(T->st,key);
    else
        return search(T->dr,key);
}

int main()
{
    srand(time(NULL));
    T = NULL;

    while (f>>s)
    {
        if (s=="MAX")
        {
            if (nr<2)
                g<<"-1\n";
            else
                g<<T->mx - T->mn<<'\n';
        }
        else if (s=="MIN")
        {
            if (nr<2)
                g<<"-1\n";
            else
                g<<T->mndif<<'\n';
        }
        else if (s=="C")
        {
            f>>x;
            g<<search(T,x)<<'\n';
        }
        else if (s=="I")
        {
            nr++;
            f>>x;
            insert(T,new treap(x,rand()+1));
        }
        else
        {
            f>>x;
            if(erase(T,x))
                g<<"-1\n";
            else
                nr--;
        }
    }
    return 0;
}