Cod sursa(job #1209422)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 17 iulie 2014 17:31:30
Problema Zeap Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.16 kb
#include <cstdio>
#include <algorithm>
#include <time.h>
#include <cstring>
#include <cstdlib>

#define INF 0x3f3f3f3f
int marime;
using namespace std;
class Treap{
public:
    Treap *st,*dr;
    int value,priority;
    int mindiff,maxdiff;
    int mini,maxi;
    Treap(){
        this->st = NULL;
        this->dr = NULL;
        this->value = 0;
        this->priority = 0;
        this-> mini = INF;
        this-> maxi = -INF;
        this-> mindiff = INF;
        this-> maxdiff = -INF;
        mindiff = maxdiff= mini = maxi = 0;
    }
    Treap(int value,int priority,Treap *st,Treap *dr){
        this->value = value;
        this->priority = priority;
        this->st = st;
        this->dr = dr;
        this-> mini = INF;
        this-> maxi = -INF;
        this-> mindiff = INF;
        this-> maxdiff = -INF;
    }
}*root,*nil;
void init(){
    srand(unsigned(time(0) + 1));
    root = nil = new Treap(0,0,NULL,NULL);
}

void Rotate_left(Treap *&T)
{
    Treap *aux = T->st;
    T->st = aux->dr;
    aux->dr = T;
    T = aux;
}
void Rotate_right(Treap *&T)
{
    Treap *aux = T->dr;
    T->dr = aux->st;
    aux->st = T;
    T = aux;
}
void Balance(Treap *&T)
{
    if(T->st->priority > T->priority)
        Rotate_left(T);
    else
        if(T->dr->priority > T->priority)
            Rotate_right(T);
}
void Insert(int value,int priority,Treap *&T)
{
    if( T == nil){
        ++marime;
        T = new Treap(value,priority,nil,nil);
        return;
    }
    if(T->value == value) return; ///ignor
    if(T->value > value)
        Insert(value,priority,T->st);
    else
        Insert(value,priority,T->dr);
    Balance(T);
}
int Search(int value,Treap *T)
{
    if(T == nil) return 0;
    if(T->value == value) return 1;
    if(T->value > value)
        return Search(value, T->st);
    return Search(value, T->dr);
}
void Delete(int value,Treap *&T)
{
    if(T == nil){
        printf("-1\n");
        return;
    }
    if(T->value > value)
        Delete(value,T->st);
    else
        if(T->value < value)
            Delete(value,T->dr);
        else
            if(T->st == nil && T->dr == nil){ delete T; T = nil; --marime;return;}
            else
            {
                if(T->st->priority > T->dr->priority)   Rotate_left(T);
                else    Rotate_right(T);
                Delete(value,T);
            }
}
void Update(Treap *&T)
{
    if(T == nil) return;

    Update(T->st);
    Update(T->dr);

    T->mini = min(T->value,min(T->st->mini,T->dr->mini));
    T->maxi = max(T->value,max(T->st->maxi,T->dr->maxi));
    if(T->st == nil && T->dr == nil)
        return;
    if(T->st != nil && T->dr != nil)
    {
        T->maxdiff = T->dr->maxi - T->st->mini;
        T->mindiff = min(T->value - T->st->maxi , T->dr->mini - T->value);
        T->mindiff = min(T->mindiff,min(T->st->mindiff,T->dr->mindiff));
    }
    if(T->st == nil)
    {
        T->maxdiff = T->maxi - T->value;
        T->mindiff = T->dr->mini - T->value;
    }
    if(T->dr == nil)
    {
        T->maxdiff = T->value - T->mini;
        T->mindiff = T->value - T->st->maxi;
    }

}

void Maxdiff(Treap *&T){
    if(marime < 2)
    {
        printf("-1\n");
        return;
    }
    Update(T);
    int vl = T->maxdiff;
    printf("%d\n",vl);
}
void Mindiff(Treap *&T){
    if(marime < 2)
    {
        printf("-1\n");
        return;
    }
    Update(T);
    int vl = T->mindiff;
    printf("%d\n",vl);
}

int main()
{
    freopen("zeap.in","r",stdin);
    freopen("zeap.out","w",stdout);

    init();
    char op[20];
    int x;
    while(scanf("%s",op) != -1)
    {
        if(op[0] == 'I')
        {
            scanf("%d",&x);
            Insert(x,rand()+1,root);
        }
        if(op[0] == 'S')
        {
            scanf("%d",&x);
            Delete(x,root);
        }
        if(op[0] == 'C')
        {
            scanf("%d",&x);
            printf("%d\n",Search(x,root));
        }
        if(op[1] == 'A')
            Maxdiff(root);
        if(op[1] == 'I')
            Mindiff(root);
        memset(op,0,sizeof(op));
    }

    return 0;
}