Cod sursa(job #2408939)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 18 aprilie 2019 15:08:39
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.14 kb
#include <fstream>
#include <iostream>
#include <stdlib.h>
#include <time.h>
#define INF 1000000000
using namespace std;
ifstream fin ("zeap.in");
ofstream fout("zeap.out");
int nr,ok,x;
char c[5];
struct T{
    int val;int heap;int mini;int maxi;int dif;
    T *st, *dr;
    T(){}
    T(int val, int heap, T *st, T *dr, int mini,int maxi ,int dif)
    {
        this->val=val;
        this->heap=heap;
        this->st=st;this->dr=dr;
        this->mini=mini;
        this->maxi=maxi;
        this->dif=dif;
    }
} *nod,*nil;
void show(T *nod, int level) {
    if(nod!=nil) {
        show(nod->dr, level+1);
        for(int i=1;i<=level;i++) cout<<"  ";
        cout<<nod->val<<" "<<nod->heap<<" "<<nod->mini<<" "<<nod->maxi<<" "<<nod->dif<<"\n";
        show(nod->st, level+1);
    }
}
void refresh(T *nod) {
    nod->mini=min(nod->val,min(nod->st->mini,nod->dr->mini));
    nod->maxi=max(nod->val,max(nod->st->maxi,nod->dr->maxi));
    nod->dif=min(nod->val-nod->st->maxi,min(nod->dr->mini-nod->val,min(nod->st->dif,nod->dr->dif)));
}
void turnright(T *&nod) {
    T *t=nod->st;
    nod->st=t->dr;t->dr=nod;
    nod=t;
    refresh(nod->dr);
    refresh(nod);
}
void turnleft(T* &nod) {
    T *t=nod->dr;
    nod->dr=t->st;t->st=nod;
    nod=t;
    refresh(nod->st);
    refresh(nod);
}
void balance(T* &nod) {
    if(nod->st!=NULL&&nod->st->heap>nod->heap) turnright(nod);
    else if(nod->dr!=NULL&&nod->dr->heap>nod->heap) turnleft(nod);
}
void in(T *&nod,int val,int heap)
{
    if(nod==nil)
    {
        nod=new T(val,heap,nil,nil,val,val,INF);nr++;
        return;
    }
    if(val<nod->val) in(nod->st,val,heap);
    else if(val>nod->val) in(nod->dr,val,heap);
    balance(nod);
    refresh(nod);
}
void out(T *&nod,int val)
{
    if(nod==nil) return;
    if(val<nod->val) out(nod->st,val);
    else if(val>nod->val) out(nod->dr,val);
    else if(val==nod->val)
    {
        if(nod->st==nil&&nod->dr==nil)
        {
            delete nod;
            nod=nil,ok=1,nr--;
        }
        else
        {
            if(nod->st->heap>nod->dr->heap) turnright(nod);
            else turnleft(nod);
            out(nod,val);
        }
    }
    if(nod!=nil) refresh(nod);
}
int cauta(T *&nod, int val)
{
    if(nod==nil) return 0;
    if(nod->val==val) return 1;
    if(nod->val>val) return cauta(nod->st,val);
    return cauta(nod->dr,val);
}
int main ()
{
    srand(time(0));int op=10;
    nod=nil=new T(0, 0, NULL, NULL, INF, -INF, INF);
    while(fin>>c)
    {
        //show(nod,0);cout<<"\n";
        if(c[0]=='I')
        {
            fin>>x;in(nod,x,rand());
            continue;
        }
        if(c[0]=='S')
        {
            fin>>x;
            ok=0;out(nod,x);
            if(ok==0) fout<<"-1\n";
            continue;
        }
        if(c[0]=='C')
        {
            fin>>x;fout<<cauta(nod,x)<<"\n";
            continue;
        }
        if(c[1]=='I')
        {
            if(nr>=2) fout<<nod->dif<<"\n"; else fout<<"-1\n";
            continue;
        }
        if(nr>=2) fout<<nod->maxi-nod->mini<<"\n"; else fout<<"-1\n";
    }
    return 0;
}