Cod sursa(job #1525618)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 15 noiembrie 2015 12:06:12
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.65 kb
#include<fstream>
#include<cstdlib>
#define inf 0x3f3f3f3f
using namespace std;
char op[20];
int current;
struct treap{
    int key;
    int priority;
    int minim;
    int maxim;
    int dif_minim;
    treap *left;
    treap *right;
    treap(int key,int priority,int minim,int maxim,int dif_minim,treap *left,treap *right){
        this->key=key;
        this->priority=priority;
        this->minim=minim;
        this->maxim=maxim;
        this->dif_minim=dif_minim;
        this->left=left;
        this->right=right;
    }
};
treap *root,*nil;
inline 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));
}
inline 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);
}
inline 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);
}
inline 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);
}
inline void treap_insert(treap *&node,int key){
    if(node==nil){
        node=new treap(key,rand(),key,key,inf,nil,nil);
        current++;
        return;
    }
    if(node->key==key)
        return;
    if(key<node->key)
        treap_insert(node->left,key);
    else
        treap_insert(node->right,key);
    balance(node);
}
inline void treap_erase(treap *&node,int key){
    if(node==nil)
        return;
    if(key<node->key)
        treap_erase(node->left,key);
    else
        if(key>node->key)
            treap_erase(node->right,key);
        else{
            if(node->left==nil&&node->right==nil){
                delete(node);
                node=nil;
                return;
            }
            if(node->left->priority>node->right->priority)
                rotate_left(node);
            else
                rotate_right(node);
            treap_erase(node,key);
        }
    if(node!=nil)
        update(node);
}
inline 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->left,key);
    else
        return treap_find(node->right,key);
}
int main(){
    ifstream f("zeap.in");
    ofstream g("zeap.out");
    int x;
    nil=new treap(0,0,inf,-inf,inf,NULL,NULL);
    root=nil;
    current=0;
    while(f>>op){
        if(op[0]=='I'){
            f>>x;
            treap_insert(root,x);
            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[1]=='A'&&op[2]=='X'){
            if(current>=2)
                g<<root->maxim-root->minim<<'\n';
            else
                g<<"-1\n";
        }
        else{
            if(current>=2)
                g<<root->dif_minim<<'\n';
            else
                g<<"-1\n";
        }
    }
    return 0;
}