Cod sursa(job #460250)

Utilizator popoiu.georgeGeorge Popoiu popoiu.george Data 1 iunie 2010 19:00:36
Problema Zeap Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.84 kb
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define INF 0x3f3f3f3f
#define inf "zeap.in"
#define outf "zeap.out"
using namespace std;

char buff[100];
int n;

struct T
{
int nr,pr,min,max,difmin;
T *as,*ad;
T( int nr, int pr, int min, int max, int difmin, T* as, T* ad )
    {
    this->nr = nr; this->pr = pr; this->min = min; this->max = max; this->difmin = difmin;
    this->as = as; this->ad = ad;
    }
} *r,*nil;

void init(T* &c)
{
srand( time(0) );
c = nil = new T(0,0,INF,-INF,INF,NULL,NULL);
}

inline int min(int a,int b) { return ( a<b ? a : b ) ; }

inline int max(int a,int b) { return ( a>b ? a : b ) ; }

inline int modul(int a) { return ( a<0 ? -a : a ) ; }

void update(T* &c)
{
c->min = min( c->min, c->as->min );
c->max = max( c->max, c->ad->max );
c->difmin = min( min( c->as->difmin, c->ad->difmin ) , min( modul( c->nr - c->as->max ), modul( c->nr - c->ad->min ) ) );
}

void rotright(T* &c)
{
T* t = c->as;
c->as = t->ad; t->ad=c;
c=t;
if( c!=nil && c->ad != nil ) update(c->ad);
}

void rotleft(T* &c)
{
T* t = c->ad ;
c->ad = t->as; t->as = c;
c=t;
if( c!=nil && c->as != nil ) update(c->as);
}

void balance(T* &c)
{
if( c->as->pr > c->pr ) rotright(c);
else if( c->ad->pr > c->pr ) rotleft(c);
update(c);
}

void insert(T* &c,int val,int pri)
{
if( c==nil )
    {
    c = new T(val,pri,val,val,INF,nil,nil);
    ++n;
    return;
    }
if( val<c->nr ) insert( c->as, val, pri );
else if( val>c->nr ) insert( c->ad, val, pri );
balance(c);
}

int find(T* &c,int val)
{
if( c==nil ) return 0;
if( val == c->nr ) return 1;
else if( val < c->nr ) return find( c->as, val );
else return find( c->ad, val );
}

void erase(T* &c,int val)
{
if( c==nil ) return;
if( val < c->nr ) erase( c->as, val );
else if( val > c->nr ) erase( c->ad, val );
else
    {
    if( c->as==nil && c->ad==nil )
        {
        delete c;
        c=nil;
        }
    else
        {
        ( c->as->pr > c->ad->pr ) ? rotright(c) : rotleft(c);
        erase(c,val);
        }
    }
if( c!=nil ) update(c);
}

void read()
{
init(r);
int x;
while( scanf("%s",&buff) != EOF )
    {
    if( buff[0]=='I' )
        {
        scanf("%d",&x);
        insert(r,x,rand()+1);
        }
    else if( buff[0]=='C' )
        {
        scanf("%d",&x);
        printf("%d\n",find(r,x));
        }
    else if( buff[0]=='S' )
        {
        scanf("%d",&x);
        if( !find(r,x) ) printf("-1\n");
        else erase(r,x), --n ;
        }
    else if( buff[0]=='M' && buff[1]=='A' )
        {
        if( n<2 ) printf("-1\n");
        else printf("%d\n", r->max - r->min );
        }
    else
        {
        if( n<2 ) printf("-1\n");
        else printf("%d\n", r->difmin);
        }
    }
}

int main()
{
freopen(inf,"r",stdin);
freopen(outf,"w",stdout);
read();
return 0;
}