Cod sursa(job #290187)

Utilizator flamecataCiobanu Alexandru-Catalin flamecata Data 27 martie 2009 16:42:13
Problema Zeap Scor 0
Compilator cpp Status done
Runda aa Marime 3.8 kb
#include <stdio.h>     
#include <algorithm>     
#include <time.h>     
#define max_pon 48234383     
#define ms 1000000001     
     
using namespace std;     
     
struct treap     
{     
    int key, prty, min, max, difm;     
    treap *l, *r;     
    treap(int key, int prty, int min, int max, int difm, treap *r, treap *l)     
    {     
        this->key = key, this->prty = prty, this->min = min, this->max = max;     
        this->difm = difm, this->r = r, this->l = l;     
    }     
} *rad_tr, *nil;     
     
int x, ct;     
char oper, op2;     
     
void calc(treap* &n)     
{     
    n->min = min(n->key, n->l->min), n->max = max(n->key, n->r->max);     
    n->difm = min(min(n->r->difm, n->l->difm), min(n->r->min - n->key, n->key - n->l->max));     
}     
     
void rr(treap* &n)     
{     
    treap *t = n->r;     
    n->r = t->l, t->l = n;     
    n = t;     
    if (n != nil && n->l != nil)     
        calc(n->l);     
}     
     
void rl(treap* &n)     
{     
    treap *t = n->l;     
    n->l = t->r, t->r = n;     
    n = t;     
    if (n != nil && n->r != nil)     
        calc(n->r);     
}     
     
void balance(treap* &n)     
{     
    if (n->r->prty > n->prty)     
        rr(n);     
    else if (n->l->prty > n->prty)     
        rl(n);     
    calc(n);     
}     
     
void insert_tr(treap* &n, int key, int pr)     
{     
    if (n == nil)     
    {     
        n = new treap(key, pr, key, key, ms, nil, nil);     
        return;     
    }     
    if (key > n->key)     
        insert_tr(n->r, key, pr);     
    else if (key < n->key)     
        insert_tr(n->l, key, pr);     
    balance(n);     
}     
     
void erase_tr(treap* &n, int key)     
{     
    if (n == nil)     
        return;     
    if (n->key > key)     
        erase_tr(n->l, key);     
    else if (n->key < key)     
        erase_tr(n->r, key);     
    else     
    {     
        if (n->l->prty > n->r->prty)     
            rl(n);     
        else rr(n);     
        if (n != nil)     
            erase_tr(n, key);     
        else     
        {     
            delete n->l;     
            n->l = NULL;     
            return;     
        }     
    }     
    calc(n);     
}     
    
int cauta_tr(treap *n, int key)     
{     
    if (n == nil)     
        return 0;     
    if (n->key > key)     
        return cauta_tr(n->l, key);     
    else if (n->key < key)     
        return cauta_tr(n->r, key);     
    return 1;     
}     
     
int main()     
{     
    srand(time(0));     
    freopen("zeap.in","r",stdin);     
    freopen("zeap.out","w",stdout);     
    rad_tr = nil = new treap(0, 0, ms, -ms, ms, NULL, NULL);     
    while (!feof(stdin))     
    {     
        scanf("%c", &oper);     
        if (oper != 'M')     
            scanf("%ld\n", &x);     
        else scanf("%c\n", &op2);     
        if (oper == 'I')     
        {     
            insert_tr(rad_tr, x, rand() % max_pon + 1);     
            ct++;     
        }     
        if (oper == 'S')     
            if (cauta_tr(rad_tr, x) == 1)     
            {     
                ct--;     
                erase_tr(rad_tr, x);     
            }     
            else printf("-1\n");     
        if (oper == 'C')     
            printf("%ld\n", cauta_tr(rad_tr, x));     
        if (oper == 'M' && ct < 2)     
            printf("-1\n");     
        else     
        {     
            if (oper == 'M' && op2 == 'A')     
                printf("%ld\n", rad_tr->max - rad_tr->min);     
            if (oper == 'M' && op2 == 'I')     
                printf("%ld\n", rad_tr->difm);     
        }     
    }     
    fclose(stdin);     
    fclose(stdout);     
    return 0;