Cod sursa(job #2401727)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 9 aprilie 2019 23:08:36
Problema Zeap Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.76 kb
#include <bits/stdc++.h>

using namespace std;

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

struct treap_node{

    int key,priority;
    treap_node *ls,*rs;
    int maxx,minn,dif_min;

    treap_node(int K, int P, treap_node *L, treap_node *R, int M, int m, int D){

        key=K;
        priority=P;
        ls=L;
        rs=R;
        maxx=M;
        minn=m;
        dif_min=D;
    }
};

treap_node *root,*nil;

bool treap_search(treap_node *node, const int &K){

    if(node==nil)
        return false;

    if(node->key==K)
        return true;

    return K<node->key ? treap_search(node->ls,K) : treap_search(node->rs,K);
}

void rot_left(treap_node *&node){

    treap_node *temp=node->ls;
    node->ls=temp->rs;
    temp->rs=node;
    node=temp;
}

void rot_right(treap_node *&node){

    treap_node *temp=node->rs;
    node->rs=temp->ls;
    temp->ls=node;
    node=temp;
}

void balance(treap_node *&node){

    if(node->ls->priority>node->priority)
        rot_left(node);
    else
        if(node->rs->priority>node->priority)
            rot_right(node);
}

void treap_update(treap_node *node){

    if(node!=nil){

        node->minn=node->maxx=node->key;
        node->dif_min=INT_MAX;

        if(node->ls!=nil){

            node->minn=min(node->minn,node->ls->minn);
            node->dif_min=min(node->dif_min,min(node->ls->dif_min,node->key-node->ls->maxx));
        }
        if(node->rs!=nil){

            node->maxx=max(node->maxx,node->rs->maxx);
            node->dif_min=min(node->dif_min,min(node->rs->dif_min,node->rs->minn-node->key));
        }
    }
}

void treap_insert(treap_node *&node, const int &K, const int &P){

    if(node==nil){

        node=new treap_node(K,P,nil,nil,K,K,INT_MAX);
        treap_update(node);
        return;
    }

    K<node->key ? treap_insert(node->ls,K,P) : treap_insert(node->rs,K,P);

    balance(node);
    treap_update(node);
}

void treap_erase(treap_node *&node, const int &K){

    if(node==nil) return;

    if(K<node->key)
        treap_erase(node->ls,K);
    else{

        if(K>node->key)
            treap_erase(node->rs,K);
        else{

            if(node->ls==nil and node->rs==nil){

                delete node;
                node=nil;
                treap_update(node);
            }
            else{

                node->ls->priority>node->rs->priority ? rot_left(node) : rot_right(node);
                treap_update(node);
                treap_erase(node,K);
            }
        }
    }
    treap_update(node);
}

int main(){

    mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
    uniform_int_distribution <int> _random(1,INT_MAX);

    root=nil=new treap_node(0,0,nullptr,nullptr,0,0,0);

    int x,elem_no=0;
    string s;

    while(f>>s){


            if(s=="I"){

                f>>x;
                if(!treap_search(root,x)){

                    int P=_random(rng);
                    treap_insert(root,x,P);
                    ++elem_no;
                }
            }
            if(s=="S"){

                f>>x;
                if(treap_search(root,x)){

                    treap_erase(root,x);
                    --elem_no;
                }
                else g<<"-1\n";
            }
            if(s=="C"){

                f>>x;
                g<<treap_search(root,x)<<'\n';
            }
           if(s=="MAX"){

                if(elem_no>1)
                    g<<root->maxx-root->minn<<'\n';
                else g<<"-1\n";
            }
            if(s=="MIN"){

                if(elem_no>1)
                    g<<root->dif_min<<'\n';
                else g<<"-1\n";
            }
        }

    return 0;
}