Cod sursa(job #1852871)

Utilizator robx12lnLinca Robert robx12ln Data 21 ianuarie 2017 11:14:39
Problema Zeap Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.1 kb
#include<fstream>
#include<cstdlib>
#include<ctime>
#include<cstring>
#define INF 2000000000
using namespace std;
ifstream fin("zeap.in");
ofstream fout("zeap.out");
char s[100], nodes, ok, n;
struct treap{
    int value;
    int priority;
    int minim;
    int maxim;
    int difmin;
    treap *st;
    treap *dr;

    treap( int value, int priority, int minim, int maxim, int difmin, treap *st, treap *dr ){
        this->value = value;
        this->priority = priority;
        this->minim = minim;
        this->maxim = maxim;
        this->difmin = difmin;
        this->st = st;
        this->dr = dr;
    }

} *r, *nill;
void update( treap *r ){
    r->minim = min( min( r->st->minim, r->dr->minim ), r->value );
    r->maxim = max( max( r->st->maxim, r->dr->maxim ), r->value );
    r->difmin = min( min( r->st->difmin, r->dr->difmin ), min( r->value - r->st->maxim, r->dr->minim - r->value ) );
}
void rotate_st( treap * &r ){
    treap *aux = r->dr;
    r->dr = aux->st;
    aux->st = r;
    r = aux;
    update( r->st );
    update(r);
    return;
}
void rotate_dr( treap * &r ){
    treap *aux = r->st;
    r->st = aux->dr;
    aux->dr = r;
    r = aux;
    update( r->dr );
    update(r);
    return;
}
void balance( treap * &r ){
    if( r->st != NULL && r->priority < r->st->priority ){
        rotate_dr(r);
    }else{
        if( r->dr != NULL && r->priority < r->dr->priority ){
            rotate_st(r);
        }
    }
    return;
}
void insertN( treap * &r, int val, int prt ){
    if( r == nill ){
        r = new treap( val, prt, INF, -INF, INF, nill, nill );
        nodes++;
    }else{
        if( val > r->value ){
            insertN( r->dr, val, prt );
        }else{
            if( val < r->value ){
                insertN( r->st, val, prt );
            }
        }
    }
    balance(r);
    update(r);
}
void removeN( treap * &r, int val ){
    if( r != nill ){
        if( val > r->value ){
            removeN( r->dr, val );
        }else{
            if( val < r->value ){
                removeN( r->st, val );
            }else{
                if( r->st == nill && r->dr == nill ){
                    delete r;
                    r = nill;
                    nodes--;
                    ok = 1;
                }else{
                    if( r->st->priority > r->dr->priority ){
                        rotate_dr(r);
                    }else{
                        rotate_st(r);
                    }
                    removeN( r, val );
                }
            }
        }
        if( r != nill )
            update(r);
    }
}
int searchN( treap *r, int val ){
    if( r == nill ){
        return 0;
    }else{
        if( r->value < val ){
            return searchN( r->dr, val );
        }else{
            if( r->value > val ){
                return searchN( r->st, val );
            }else{
                return 1;
            }
        }
    }
}
int main(){
    r = nill = new treap( 0, 0, INF, -INF, INF, NULL, NULL );
    nodes = 0;
    srand( time(0) );
    while( fin.get( s, 100 ) ){
        n = strlen(s);
        int i;
        for( i = 0; i < n; i++ ){
            if( s[i] == ' ' ){
                break;
            }
        }
        i++;
        int number = 0;
        for( ; i < n; i++ ){
            number = number * 10 + ( s[i] - '0' );
        }
        if( s[0] == 'I' ){
            insertN( r, number, rand() );
        }
        if( s[0] == 'S' ){
            ok = 0;
            removeN( r, number );
            if( ok == 0 ) fout << "-1\n";
        }
        if( s[0] == 'C' ){
            fout << searchN( r, number ) << "\n";
        }
        if( s[1] == 'A' ){
            if( nodes >= 2 ){
                fout << r->maxim - r->minim << "\n";
            }else{
                fout << "-1\n";
            }
        }
        if( s[1] == 'I' ){
            if( nodes >= 2 ){
                fout << r->difmin << "\n";
            }else{
                fout << "-1\n";
            }
        }
        fin.get();
    }
    return 0;
}