Cod sursa(job #1994394)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 24 iunie 2017 20:42:40
Problema Zeap Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.62 kb
#include<bits/stdc++.h>
#define INF 1<<30
using namespace std;
int nodes;
char c;
int x;
struct Treap
{
    int key,priority;
    Treap *left,*right;
    int minim,maxim,difmin;
    Treap(int key,int priority,int minim,int maxim,int difmin,Treap *left,Treap *right)
    {
        this->key=key;
        this->priority=priority;
        this->left=left;
        this->right=right;
        this->maxim=maxim;
        this->minim=minim;
        this->difmin=difmin;
    }
}*root, *empty;
inline void init()
{
    srand(unsigned(time(0)));
    root=empty=new Treap(0,0,INF,-INF,INF,NULL,NULL);
}
inline void Update(Treap* &node)
{
    node->maxim=max(node->key,node->right->maxim);
    node->minim=min(node->key,node->left->minim);
    node->difmin=min(min(node->left->difmin,node->right->difmin),
                     min(abs(node->key-node->left->maxim),abs(node->key-node->right->minim)));
}
inline void RotLeft(Treap* &node)
{
    Treap *t=node->left;
    node->left=t->right;
    t->right=node;
    node=t;
    if(node!=empty && node->right!=empty) Update(node->right);
}
inline void RotRight(Treap* &node)
{
    Treap *t=node->right;
    node->right=t->left;
    t->left=node;
    node=t;
    if(node!=empty && node->left!=empty) Update(node->left);
}
inline void Balance(Treap* &node)
{
    if(node->left->priority<node->priority) RotLeft(node);
        else
    if(node->right->priority<node->priority) RotRight(node);
    Update(node);
}
inline void Insert(Treap* &node,int key,int priority)
{
    if(node==empty)
    {
        node=new Treap(key,priority,key,key,INF,empty,empty);
        nodes++;
        return;
    }
    if(key<node->key) Insert(node->left,key,priority);
        else Insert(node->right,key,priority);
    Balance(node);
}

inline void Erase(Treap* &node,int key)
{
    if(node==empty)
        return;
    if(key<node->key) Erase(node->left,key);
        else
    if(key>node->key) Erase(node->right,key);
        else
    {
        if(node->left==empty && node->right==empty)
            delete node,node=empty,nodes--;
                else
        {
            if(node->left->priority>node->right->priority) RotLeft(node);
                else RotRight(node);
            Erase(node,key);
        }
    }
    if(node!=empty)
        Update(node);
}
inline int Search(Treap* node,int key)
{
    if(node==empty) return 0;
    if(node->key==key) return 1;
    if(key<node->key) return Search(node->left,key);
    if(key>node->key) return Search(node->right,key);
}
int main()
{
    freopen("zeap.in","r",stdin);
    freopen("zeap.out","w",stdout);
    init();
    while(!feof(stdin))
    {
        scanf("%c",&c);
        if(c=='I')
        {
            scanf("%d",&x);
            scanf("\n");
            Insert(root,x,rand()%INF+1);
        }
            else
        if(c=='S')
        {
            scanf("%d",&x);
            scanf("\n");
            if(Search(root,x)) Erase(root,x);
                else printf("-1\n");
        }
            else
        if(c=='C')
        {
            scanf("%d",&x);
            scanf("\n");
            printf("%d\n",Search(root,x));
        }
            else
        if(c=='M')
        {
            scanf("%c",&c);
            scanf("%c",&c);
            scanf("\n");
            if(nodes<2)
            {
                printf("-1\n");
            }
                else
            {
            if(c=='X')
                printf("%d\n",root->maxim-root->minim);
                else
                printf("%d\n",root->difmin);
            }
        }
    }
    return 0;
}