Cod sursa(job #1026514)

Utilizator geniucosOncescu Costin geniucos Data 11 noiembrie 2013 18:37:52
Problema Zeap Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.21 kb
#include<cstdio>
#include<ctime>
#include<cstdlib>
using namespace std;
int po,x,INS,INF;
char sir[50];
struct T
{
    int P,K,mini,maxi,dfmin;
    T *l,*r;
    T(int K,int P,int mini,int maxi,int dfmin,T *l,T *r)
    {
        this->K=K;
        this->P=P;
        this->maxi=maxi;
        this->mini=mini;
        this->dfmin=dfmin;
        this->l=l;
        this->r=r;
    }
}*R,*nil;

int Rand(){return (((rand()%32767)<<15)+(rand()%32767))+1;}

void reup(T *&n)
{
    n->mini=n->maxi=n->K;
    if(n->l->mini<n->mini) n->mini=n->l->mini;
    if(n->r->mini<n->mini) n->mini=n->r->mini;
    if(n->r->maxi>n->maxi) n->maxi=n->r->maxi;
    if(n->l->maxi>n->maxi) n->maxi=n->l->maxi;
    if(n->l==nil&&n->r==nil) n->dfmin=INF;
    else
    {
        n->dfmin=INF;
        if(n->l!=nil) n->dfmin=n->K-n->l->maxi;
        if(n->r!=nil&&n->dfmin>n->r->mini-n->K) n->dfmin=n->r->mini-n->K;
        if(n->l!=nil&&n->l->dfmin<n->dfmin) n->dfmin=n->l->dfmin;
        if(n->r!=nil&&n->r->dfmin<n->dfmin) n->dfmin=n->r->dfmin;
    }
}

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

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

void balance(T *&n)
{
    if(n->l->P>n->P) rotleft(n);
    else
    if(n->r->P>n->P) rotright(n);
}

void Insert(T *&n,int K)
{
    if(n==nil)
    {
        n=new T(K,Rand(),K,K,INF,nil,nil);
        return ;
    }
    if(n->K<K) Insert(n->r,K);
    else
    if(n->K>K) Insert(n->l,K);
    else return ;
    reup(n);
    balance(n);
}

void Erase(T *&n,int K)
{
    if(n==nil)
    {
        printf("-1\n");
        return ;
    }
    if(n->K>K) Erase(n->l,K);
    else
    if(n->K<K) Erase(n->r,K);
    else
    {
        if(n->l==nil&&n->r==nil)
        {
            delete n;
            n=nil;
        }
        else
        {
            if(n->l->P>n->r->P) rotleft(n);
            else rotright(n);
            Erase(n,K);
        }
    }
    if(n!=nil) reup(n);
}

int Search(T *&R,int K)
{
    if(R==nil) return 0;
    if(R->K>K) return Search(R->l,K);
    else
    if(R->K<K) return Search(R->r,K);
    else return 1;
}

void val(int &x)
{
    x=0;
    while(sir[po]>='0'&&sir[po]<='9')
    {
        x=x*10+sir[po]-48;
        po++;
    }
    po++;
}

int main()
{
freopen("zeap.in","r",stdin);
freopen("zeap.out","w",stdout);
srand(time(0));
INF=(1<<30)+2;
nil=new T(0,0,INF,-INF,INF,0,0);
INF=(1<<30)+3;
INS=0;
while(!feof(stdin))
{
    gets(sir+1);
    if(feof(stdin)) break;
    if(sir[1]=='I')
    {
        po=3;
        val(x);
        INS++;
        if(INS==1) R=new T(x,Rand(),x,x,INF,nil,nil);
        else Insert(R,x);
    }
    else
    if(sir[1]=='S')
    {
        po=3;
        val(x);
        Erase(R,x);
    }
    else
    if(sir[1]=='C')
    {
        po=3;
        val(x);
        printf("%d\n",Search(R,x));
    }
    else
    if(sir[2]=='I')
    {
        if(R->dfmin>=INF) printf("-1\n");
        else printf("%d\n",R->dfmin);
    }
    else
    {
        if(R->dfmin>=INF) printf("-1\n");
        else printf("%d\n",R->maxi-R->mini);
    }
}
return 0;
}