Cod sursa(job #2225720)

Utilizator patcasrarespatcas rares danut patcasrares Data 28 iulie 2018 03:17:42
Problema Zeap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.24 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");
long long f,p,vf;
char c;
struct treap
{
    long long ma=0,mi=2e9,r1=0,r2=2e9,pr,val;
    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;
    }
}*r,*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->r1=max(nod->r1,max(abs(nod->val-nod->st->ma),abs(nod->val-nod->st->mi)));
        nod->r2=min(nod->r2,min(abs(nod->val-nod->st->ma),abs(nod->val-nod->st->mi)));
    }
    if(nod->dr!=nil)
    {
        nod->r1=max(nod->r1,max(abs(nod->val-nod->dr->ma),abs(nod->val-nod->dr->mi)));
        nod->r2=min(nod->r2,min(abs(nod->val-nod->dr->ma),abs(nod->val-nod->dr->mi)));
    }
    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));
    }
}
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);
        nod->ma=nod->mi=f;
        nod->r1=0;
        nod->r2=2e9;
        return;
    }
    if(nod->val==f)
        return;
    if(f<nod->val)
        ins(nod->st);
    else
        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(nod->st);
    if(act->dr!=nil)
        compute(nod->dr);
    compute(nod);
}
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()
{
    r=nil=new treap(0,0,NULL,NULL);
    srand(time(0));
    //cout<<rand()+1;
    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';
            p=rand()+1;
            ins(r);
            continue;
        }
        if(c=='S')
        {
            vf=0;
            f=0;
            for(int i=1;i<strlen(sir);i++)
                if(isdigit(sir[i]))
                    f=f*10+sir[i]-'0';
            del(r);
            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(r)<<'\n';
            continue;
        }
        if(sir[2]=='X')
        {
            if(r->r1==0)
                fout<<-1<<'\n';
            else
                fout<<r->r1<<'\n';
        }
        else
        {
            if(r->r2==2e9)
                fout<<-1<<'\n';
            else
                fout<<r->r2<<'\n';
        }
    }
}