Cod sursa(job #1446927)

Utilizator MihaiEMihaiE MihaiE Data 3 iunie 2015 10:40:08
Problema Zeap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.02 kb
#include <stdio.h>
#include <cstring>
#include <bitset>
#include <string>
#include <algorithm>
#include <vector>
#include <cmath>
#include <stack>
#include <queue>
#include <list>
#include <set>
#include <stdlib.h>
#include <time.h>
#include <deque>
#define inf 99999999
using namespace std;
struct node { int key,pos,priority; node *left,*right;
       node(){
       key=0; priority=0; pos=0; left=NULL; right=NULL;
       }
};
int x,minn,y,nr,pos[3000010],l; bool ok;
char ss[16];
string s;
node *root,*nil;
void rotleft(node* &a)
{
    node *aux=a->left;
    a->left=aux->right; aux->right=a;
    a=aux;
}
void rotright(node* &a)
{
    node *aux=a->right;
    a->right=aux->left; aux->left=a;
    a=aux;
}
void balance(node* &a)
{
    if (a->left->priority>a->priority) rotleft(a); else
    if (a->right->priority>a->priority) rotright(a);
}
inline void insert(node* &a,int key,int priority)
{
    if (a==nil){
        a=new node; a->key=key; a->priority=priority;
        a->left=nil; a->right=nil;
        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); ok=true; a=nil; return; }
            if (a->left->priority>a->right->priority) rotleft(a); else
                rotright(a);
            erase(a,key);
        }
}
int findmin(node* a)
{
    if (a->left==nil) return (a->key); else
        findmin (a->left);
}
int findmax(node* a)
{
    if (a->right==nil) return (a->key); else
        findmax (a->right);
}
inline int dif(node* a)
{
    if (a==nil) return (-1);
    if (a->left==nil || a->right==nil) return (-1);
    int x=findmin(a);
    int y=findmax(a);
    return (y-x);
}
inline int finddifmin(node* a)
{
    if (a==nil) return;
    if (a->left!=nil) minn=min(minn,a->key-a->left->key),finddifmin(a->left);
    if (a->right!=nil) minn=min(minn,a->right->key-a->key),finddifmin(a->right);
}
int main(){
freopen("zeap.in","r",stdin);
freopen("zeap.out","w",stdout);
srand(unsigned(time(0)));
nil=new node; root=nil; nr=0;
while (!feof(stdin)){
    scanf("%s",ss); s=ss;
    if (s=="MIN") {
        minn=inf;finddifmin(root);
        if (minn==inf) printf("%d\n",-1); else printf("%d\n",minn); y=0;
    } else
    if (s=="MAX") printf("%d\n",dif(root)),y=0; else
    if (s=="I") { scanf("%d",&x); nr++; insert(root,x,rand()+1); y=0; } else
    if (s=="S") { scanf("%d",&x); ok=false; erase(root,x); y=0;
        if (!ok) printf("-1\n");
    } else
    if (s=="C") { scanf("%d",&x); printf("%d\n",find(root,x)); y=0; }
    scanf("\n");
}
return 0;
}