Cod sursa(job #502562)

Utilizator APOCALYPTODragos APOCALYPTO Data 20 noiembrie 2010 01:22:07
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.92 kb
using namespace std;
#include<iostream>
#include<fstream>
#include<cstdlib>
#include<ctime>
#define oo 0x3f3f3f3f

ofstream fout("zeap.out");
struct T{
int key,p,min,max,difmin;
T *l, *r;
T(){}
T(int key,int p,int min,int max,int difmin, T* l, T* r)
{
    this->key=key;
    this->p=p;
    this->min=min;
    this->max=max;
    this->difmin=difmin;
    this->l=l;
    this->r=r;
}

};
T *R,*nil;
typedef T* treap;
void init()
{

    R=nil= new T(-oo,-oo,oo,-oo,oo,NULL,NULL);
}
void update(T* &n)
{
    if(n!=nil)
    {
        n->min=min(min(n->l->min,n->r->min),n->key);
        n->max=max(max(n->l->max,n->r->max),n->key);
        n->difmin=min(min(n->l->difmin,n->r->difmin),min(n->key-n->l->max,n->r->min-n->key));

    }

}

void rotright(T* &n)
{
    T* t=n->r;
    n->r=t->l;
    t->l=n;
    n=t;
}

void rotleft(T* &n)
{
    T* t=n->l;
    n->l=t->r;
    t->r=n;
    n=t;
}

void balance(T* &n)
{

    if(n->p<n->l->p) { rotleft(n); update(n->r); update(n);}
    if(n->p<n->r->p) {rotright(n); update(n->l); update(n);}

}

void insert(treap &n,int val)
{
    if(n==nil)
    {n=new T;
    n->r=nil;
    n->l=nil;
    n->difmin=oo;

    n->p=rand();
    n->min=n->max=n->key=val;
    return;
    }
    if(val>n->key)
        insert(n->r,val);
    if(val<n->key)
        insert(n->l,val);
    update(n);
    balance(n);
    update(n);
}
void erase(T* &n,int key)
{
    if(n==nil) {fout<<-1<<"\n";return;}

    if(key<n->key) erase(n->l,key);
    if(key>n->key) erase(n->r,key);
    if(key==n->key)
        {
            if(n->l==nil && n->r==nil)
            {
                delete n;
                n=nil;
                return;
            }
            else
            if(n->l->p>n->r->p)
            {
                rotleft(n);
                update(n->r);
                update(n);
            }
            else
            {
                rotright(n);
                update(n->l);
                update(n);
            }
            erase(n,key);
        }
    update(n);
}
void cauta(T* &n, int key)
{
    if(n==nil) {fout<<0<<"\n"; return;}
    if(n->key==key) {fout<<1<<"\n"; return;}
    if(key<n->key) cauta(n->l,key);
    if(key>n->key) cauta(n->r,key);

}

void cit()
{char ca;
int x;
    ifstream fin("zeap.in");
    while(fin>>ca)
    {
        if(ca=='I') {fin>>x; insert(R,x);}
        if(ca=='S') {fin>>x; erase(R,x);}
        if(ca=='C') {fin>>x; cauta(R,x);}
        if(ca=='M')
        {
            fin>>ca; fin>>ca;
            if(R==nil|| (R->l==nil&& R->r==nil))
               fout<<-1<<"\n";
              else
                {if(ca=='X')
                   fout<<R->max-R->min<<"\n";
                  else
                   fout<<R->difmin<<"\n";

                }

        }
    }

}

int main()
{
    srand(time(0));
    init();
    cit();
    fout.close();
    return 0;
}