Cod sursa(job #1525471)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 15 noiembrie 2015 09:24:08
Problema Zeap Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3 kb
#include<fstream>
#include<ctime>
#include<cstdlib>
#define inf 2000000000
using namespace std;
char op[10],current=0;
struct node{
    int key;
    int priority;
    int mini;
    int maxi;
    int difmin;
    node *left;
    node *right;
    node(){
        key=priority=0;
        mini=difmin=inf;
        maxi=-inf;
        left=right=NULL;
    }
};
node *root,*nil;
inline void update(node *&a)
{
    a->mini=min(a->key,a->left->mini);
    a->maxi=max(a->key,a->right->maxi);
    a->difmin=min(min(a->left->difmin,a->right->difmin),min(a->key-a->left->maxi,a->right->mini-a->key));
}
inline void rotleft(node* &a)
{
    node *aux=a->left;
    a->left=aux->right; aux->right=a;
    a=aux;
    if (a!=nil && a->right!=nil) update(a->right);
}
inline void rotright(node* &a)
{
    node *aux=a->right;
    a->right=aux->left; aux->left=a;
    a=aux;
    if (a!=nil && a->left!=nil) update(a->left);
}
void balance(node* &a)
{
    if (a->left->priority>a->priority) rotleft(a); else
    if (a->right->priority>a->priority) rotright(a);
    update(a);
}
inline void insert(node* &a,int key,int priority)
{
    if (a==nil){
        a=new node; a->key=key; a->priority=priority; a->mini=key; a->maxi=key;
        a->left=nil; a->right=nil; current++;
        return;
    }
    if (key==a->key) return;
    if (key<a->key) insert(a->left,key,priority); else
        insert(a->right,key,priority);
    balance(a);
}
inline int find(node *a,int key)
{
    if (a==nil) return 0;
    if (a->key==key) return 1;
    if (key<a->key) return(find(a->left,key)); else
        return(find(a->right,key));
}
inline void erase(node* &a,int key)
{
    if (a==nil) return;
    if (key<a->key) erase(a->left,key); else
        if (key>a->key) erase(a->right,key); else
        {
            if (a->left==nil && a->right==nil) { delete(a);   a=nil; return; }
            if (a->left->priority>a->right->priority) rotleft(a); else
                rotright(a);
            erase(a,key);
        }
        if (a!=nil) update(a);
}
int main(){
    ifstream f("zeap.in");
    ofstream g("zeap.out");
    int x;
    srand(time(0));
    nil=new node;
    root=nil;
    while(f>>op){
        if(op[0]=='I'){
            f>>x;
            insert(root,x,rand());
            continue;
        }
        if(op[0]=='S'){
            f>>x;
            if(find(root,x)==0){
                g<<"-1\n";
                continue;
            }
            erase(root,x);
            current--;
            continue;
        }
        if(op[0]=='C'){
            f>>x;
            g<<find(root,x)<<'\n';
            continue;
        }
        if(op[0]=='M'&&op[2]=='N'){
            if(current<2)
                g<<"-1\n";
            else
                g<<root->difmin<<'\n';
            continue;
        }
        if(op[0]=='M'&&op[2]=='X')
            if(current<2)
                g<<"-1\n";
            else
                g<<root->maxi-root->mini<<'\n';
    }
    return 0;
}