Cod sursa(job #3269539)

Utilizator vladm98Munteanu Vlad vladm98 Data 19 ianuarie 2025 15:14:13
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.95 kb
#include <fstream>
using namespace std;

ifstream cin("zeap.in");
ofstream cout("zeap.out");

// asta e ok
int randomNum(){
    return abs((rand()<<15)+rand())+1;
}

// asta e ok
struct treap{
    int val,min1,max1,mind,priority;
    treap *st,*dr;
    treap(int val,treap *st,treap *dr){
        this->val=this->min1=this->max1=val;
        this->mind=1e9;
        this->priority=randomNum();
        this->st=st;this->dr=dr;
    }
};

// asta e ok
treap *nill=new treap(0,nullptr,nullptr);
treap *root=nill;

// vine dinspre st catre dr
void rotatest(treap *&nod){
    treap *aux=nod->st;
    nod->st=aux->dr;
    aux->dr=nod;
    nod=aux;
}

// vine dinspre dr catre st
void rotatedr(treap *&nod){
    treap *aux=nod->dr;
    nod->dr=aux->st;
    aux->st=nod;
    nod=aux;
}

// asta e ok
void vf(treap *&nod){
    if(nod==nill) return;
    nod->min1=nod->max1=nod->val;
    nod->mind=1e9;
    if(nod->st!=nill){
        nod->min1=nod->st->min1;
        nod->mind=min(nod->mind,nod->st->mind);
        nod->mind=min(nod->mind,nod->val-nod->st->max1);
    }
    if(nod->dr!=nill){
        nod->max1=nod->dr->max1;
        nod->mind=min(nod->mind,nod->dr->mind);
        nod->mind=min(nod->mind,nod->dr->min1-nod->val);
    }
}

// asta e ok
void balance(treap *&nod){
    if(nod==nill) return ;
    if(nod->priority<nod->st->priority) rotatest(nod);
    if(nod->priority<nod->dr->priority) rotatedr(nod);
    vf(nod->st);
    vf(nod->dr);
    vf(nod);
}

void insert(treap *&nod,int val){
    if(nod==nill){
        nod=new treap(val,nill,nill);
        return ;
    }
    if(val<=nod->val){
        insert(nod->st,val);
    }else{
        insert(nod->dr,val);
    }
    balance(nod);
}

bool find(treap *& nod,int val){
    if(nod==nill) return 0;
    if(nod->val==val) return 1;
    if(val<nod->val){
        return find(nod->st,val);
    }else{
        return find(nod->dr,val);
    }
}

void erase(treap *&nod,int val){
    if(val<nod->val){
        erase(nod->st,val);
    }else if(val>nod->val){
        erase(nod->dr,val);
    }else{
        if(nod->st==nill && nod->dr==nill){
            delete nod;
            nod=nill;
            return;
        }
        if(nod->st->priority<nod->dr->priority){
            rotatedr(nod);
        }else{
            rotatest(nod);
        }
        erase(nod,val);
    }
    balance(nod);
}

int main()
{
    nill->priority=0;
    string s;
    int a;
    while(cin>>s){
        if(s=="I"){
            cin>>a;
            if(!find(root,a)){
                insert(root,a);
            }
        }else if(s=="S"){
            cin>>a;
            if(find(root,a)){
                erase(root,a);
            }else cout<<"-1\n";
        }else if(s=="C"){
            cin>>a;
            cout<<find(root,a)<<"\n";
        }else if(s=="MIN"){
            if(root->mind==1e9) cout<<"-1\n";
            else cout<<root->mind<<"\n";
        }else{
            if(root->mind==1e9) cout<<"-1\n";
            else cout<<root->max1-root->min1<<"\n";
        }
    }
    return 0;
}