Cod sursa(job #1525414)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 15 noiembrie 2015 00:18:11
Problema Zeap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.55 kb
#include<fstream>
#include<ctime>
#include<cstdlib>
#define inf 2000000000
using namespace std;
char op[10],current=0;
struct treap{
    int key;
    int priority;
    int minim;
    int maxim;
    int dif_minim;
    treap *left;
    treap *right;
    treap(){
        key=priority=0;
        minim=dif_minim=inf;
        maxim=-inf;
        left=right=NULL;
    }
};
treap *root,*nil;
void update(treap *&node){
    node->minim=min(node->key,node->left->minim);
    node->maxim=max(node->key,node->right->maxim);
    node->dif_minim=min(min(node->left->dif_minim,node->right->dif_minim),min(node->key-node->left->maxim,node->right->minim-node->key));
}
void rotate_right(treap *&node){
    treap *temp=node->right;
    node->right=temp->left;
    temp->left=node;
    node=temp;
    if(node!=nil&&node->left!=nil)
        update(node->left);
}
void rotate_left(treap *&node){
    treap *temp=node->left;
    node->left=temp->right;
    temp->right=node;
    node=temp;
    if(node!=nil&&node->right!=nil)
        update(node->right);
}
void balance(treap *&node){
    if(node->left->priority>node->priority)
        rotate_left(node);
    else
        if(node->right->priority>node->priority)
            rotate_right(node);
    update(node);
}
void treap_insert(treap *&node,int key,int priority){
    if(node==nil){
        node=new treap;
        current++;
        node->key=node->minim=node->maxim=key;
        node->priority=priority;
        node->left=node->right=nil;
        return;
    }
    if(node->key==key)
        return;
    if(key>node->key)
        treap_insert(node->right,key,priority);
    else
        treap_insert(node->left,key,priority);
    balance(node);
}
void treap_erase(treap *&node,int key){
    if(node==nil)
        return;
    if(key>node->key)
        treap_erase(node->right,key);
    else
        if(key<node->key)
            treap_erase(node->left,key);
        else{
            if(node->left==nil&&node->right==nil){
                delete(node);
                node=nil;
                return;
            }
            if(node->left->priority<node->right->priority)
                rotate_right(node);
            else
                rotate_left(node);
            treap_erase(node,key);
        }
    if(node!=nil)
        update(node);
}
int treap_find(treap *node,int key){
    if(node==nil)
        return 0;
    if(node->key==key)
        return 1;
    if(node->key<key)
        return treap_find(node->right,key);
    else
        return treap_find(node->left,key);
}
int main(){
    ifstream f("tema.in");
    ofstream g("tema.out");
    int x;
    srand(time(0));
    nil=new treap;
    root=nil;
    while(f>>op){
        if(op[0]=='I'){
            f>>x;
            treap_insert(root,x,rand());
            continue;
        }
        if(op[0]=='S'){
            f>>x;
            if(treap_find(root,x)==0){
                g<<"-1\n";
                continue;
            }
            treap_erase(root,x);
            current--;
            continue;
        }
        if(op[0]=='C'){
            f>>x;
            g<<treap_find(root,x)<<'\n';
            continue;
        }
        if(op[0]=='M'&&op[2]=='N'){
            if(current<2)
                g<<"-1\n";
            else
                g<<root->dif_minim<<'\n';
            continue;
        }
        if(op[0]=='M'&&op[2]=='X')
            if(current<2)
                g<<"-1\n";
            else
                g<<root->maxim-root->minim<<'\n';
    }
    return 0;
}