Cod sursa(job #1525617)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 15 noiembrie 2015 12:05:47
Problema Zeap Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.84 kb
#include<cstdio>
#include<ctime>
#include<stdlib.h>
#define inf 2000000000
using namespace std;
int found;
char op[10];
int current=0;
struct treap{
    int key;
    int priority;
    int minim;
    int maxim;
    int dif_minim;
    treap *left;
    treap *right;
};
treap *root,*nil;
int maximum(int a,int b){
    if(a<b)
        return b;
    return a;
}
int minimum(int a,int b){
    if(a>b)
        return b;
    return a;
}
void update(treap *&node){
    node->minim=minimum(node->key,node->left->minim);
    node->maxim=maximum(node->key,node->right->maxim);
    node->dif_minim=minimum(minimum(node->left->dif_minim,node->right->dif_minim),minimum(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->dif_minim=inf;
        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{
            found=1;
            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(){
    freopen("zeap.in","r",stdin);
    freopen("zeap.out","w",stdout);
    int x;
    srand(time(0));
    root=new treap;
    nil=new treap;
    nil->key=nil->priority=0;
    nil->minim=nil->dif_minim=inf;
    nil->maxim=-inf;
    nil->left=nil->right=NULL;
    root=nil;
    while(scanf("%s",&op)!=EOF){
        if(op[0]=='I'||op[0]=='C'||op[0]=='S'){
            scanf("%d",&x);
            if(op[0]=='I')
                treap_insert(root,x,rand());
            if(op[0]=='S'){
                found=0;
                treap_erase(root,x);
                if(found==0)
                    printf("-1\n");
                else
                    current--;
            }
            if(op[0]=='C')
                printf("%d\n",treap_find(root,x));
        }
        if(op[0]=='M'&&op[2]=='N')
            if(current<2)
                printf("-1\n");
            else
                printf("%d\n",root->dif_minim);
        if(op[0]=='M'&&op[2]=='X')
            if(current<2)
                printf("-1\n");
            else
                printf("%d\n",root->maxim-root->minim);
        scanf("\n");
    }
    return 0;
}