Cod sursa(job #2225756)

Utilizator patcasrarespatcas rares danut patcasrares Data 28 iulie 2018 06:00:47
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.12 kb
#include<fstream>
#include<deque>
#include<ctime>
#include<cctype>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<unordered_map>
#define DN 100005
#define x first
#define y second
using namespace std;
ifstream fin("zeap.in");
ofstream fout("zeap.out");
int f,p,vf;
char c;
struct treap
{
    int ma=0,mi=2e9,r1=0,r2=2e9,pr=0,val=0;
    treap *st=0,*dr=0;
    treap(){}
    treap(int value,int pri,treap *a,treap *b)
    {
        this->st=a;
        this->dr=b;
        this->pr=pri;
        this->val=value;
    }
}*T,*nil;
void compute(treap *&nod)
{
    nod->ma=max(nod->val,max(nod->st->ma,nod->dr->ma));
    nod->mi=min(nod->val,min(nod->st->mi,nod->dr->mi));
    nod->r1=max(nod->st->r1,nod->dr->r1);
    nod->r2=min(nod->st->r2,nod->dr->r2);
    if(nod->st!=nil&&nod->dr!=nil)
    {
        nod->r1=max(nod->r1,abs((nod->st->mi)-(nod->dr->ma)));
        nod->r2=min(nod->r2,abs((nod->st->ma)-(nod->dr->mi)));
    }
    if(nod->st!=nil)
    {
        nod->r1=max(nod->r1,abs((nod->st->mi)-nod->val));
        nod->r2=min(nod->r2,abs((nod->st->ma)-nod->val));
    }
    if(nod->dr!=nil)
    {
        nod->r1=max(nod->r1,abs((nod->dr->ma)-nod->val));
        nod->r2=min(nod->r2,abs((nod->dr->mi)-nod->val));
    }
}
void rot1(treap *&nod)
{
    treap *t=nod->st;
    nod->st=t->dr;
    t->dr=nod;
    nod=t;
}
void rot2(treap *&nod)
{
    treap *t=nod->dr;
    nod->dr=t->st;
    t->st=nod;
    nod=t;
}
void balance(treap *&nod)
{
    if(nod->st->pr>nod->pr)
        rot1(nod);
    if(nod->dr->pr>nod->pr)
        rot2(nod);
    if(nod->st!=nil)
        compute(nod->st);
    if(nod->dr!=nil)
        compute(nod->dr);
}
void ins(treap *&nod)
{
    if(nod==nil)
    {
        nod=new treap(f,p,nil,nil);
        return;
    }
    if(f<nod->val)
        ins(nod->st);
    else
        if(f>nod->val)
            ins(nod->dr);
    balance(nod);
    compute(nod);
}
void del(treap * &nod)
{
    if(nod==nil)
        return;
    treap *act=nod;
    if(f<nod->val)
        del(nod->st);
    if(f>nod->val)
        del(nod->dr);
    if(nod->val==f)
    {
        vf=1;
        if(nod->st==nil&&nod->dr==nil)
        {
            delete nod;
            nod=nil;
            return;
        }
        if(nod->st->pr>nod->dr->pr)
        {
            act=nod->st;
            rot1(nod);
        }
        else
        {
            act=nod->dr;
            rot2(nod);
        }
        del(nod);
    }
    if(act->st!=nil)
        compute(act->st);
    if(act->dr!=nil)
        compute(act->dr);
    compute(act);
}
int cauta(treap * &nod)
{
    if(nod==nil)
        return 0;
    if(nod->val==f)
        return 1;
    if(f<nod->val)
        return cauta(nod->st);
    return cauta(nod->dr);
}
char sir[45];
int main()
{
    T=nil=new treap(0,0,NULL,NULL);
    cout<<nil->mi;
    //    srand(time(0))<<'\n';
    while(fin.getline(sir,45))
    {
        if(sir[0]=='I')
        {
            f=0;
            for(int i=1;i<strlen(sir);i++)
                if(isdigit(sir[i]))
                    f=f*10+sir[i]-'0';
          //  cout<<f<<'\n';
            p=rand()%((int)1e9)+1;
          //  if(!cauta(T))
            ins(T);
            continue;
        }
        if(sir[0]=='S')
        {
            vf=0;
            f=0;
            for(int i=1;i<strlen(sir);i++)
                if(isdigit(sir[i]))
                    f=f*10+sir[i]-'0';
            del(T);
            if(!vf)
                fout<<-1<<'\n';
            continue;
        }
        if(sir[0]=='C')
        {
            f=0;
            for(int i=1;i<strlen(sir);i++)
                if(isdigit(sir[i]))
                    f=f*10+sir[i]-'0';
            fout<<cauta(T)<<'\n';
            continue;
        }
        if(sir[2]=='X')
        {
            if(T->r1==0)
                fout<<-1<<'\n';
            else
                fout<<T->r1<<'\n';
        }
        else
        {
            if(T->r2==2e9)
                fout<<-1<<'\n';
            else
                fout<<T->r2<<'\n';
        }
    }
}