Cod sursa(job #2217801)

Utilizator Laura_CorneiLaura Maria Cornei Laura_Cornei Data 2 iulie 2018 11:46:53
Problema Zeap Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.98 kb
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
using namespace std;
FILE * f1=fopen("zeap.in", "r");
FILE * f2=fopen("zeap.out", "w");
int nrel;
struct treap
{
    treap *l, *r;
    int cheie, prior;
    int mini, maxi, dfmin; ///mini, maxi subarbore, dfmin dintre oricare 2 val din subarb
} *rad;
void Creare(treap *&el, int cheie)
{
    el=new treap;
    el->cheie=cheie;
    el->prior=rand();
    el->mini=el->maxi=cheie;
    el->l=el->r=0;
    el->dfmin=2000000001;
}
void Update(treap *nod)
{
    if(nod==0) return;
    if(nod->l!=0)
    {
        nod->mini=min(nod->mini, nod->l->mini);
        nod->maxi=max(nod->maxi, nod->l->maxi);
        nod->dfmin=min(abs(nod->cheie- nod->l->cheie), min(nod->dfmin, nod->l->dfmin));
    }
    if(nod->r!=0)
    {
        nod->mini=min(nod->mini, nod->r->mini);
        nod->maxi=max(nod->maxi, nod->r->maxi);
        nod->dfmin=min(abs(nod->cheie- nod->r->cheie), min(nod->dfmin, nod->r->dfmin));
    }
}
void Split(treap *rad, treap *&l, treap *&r, int cheie)
{
    if(rad==0) l=r=0;
    else if(rad->cheie> cheie)
    {
        Split(rad->l, l, rad->l,cheie);
        r=rad;
    }
    else
    {
        Split(rad->r, rad->r, r, cheie);
        l=rad;
    }
    Update(rad);
}
void Merge(treap *&rad, treap *l, treap *r)
{
    if(l==0) rad=r;
    else if(r==0) rad=l;
         else if(l->prior> r->prior)
         {
             Merge(l->r, l->r, r);
             rad=l;
         }
         else
         {
             Merge(r->l, l, r->l);
             rad=r;
         }
    Update(rad);
}
int Cauta(treap *rad, int cheie)
{
    if(rad==0) return 0;
    else if(rad->cheie==cheie) return 1;
         else if(rad->cheie> cheie) return Cauta(rad->l, cheie);
              else return Cauta(rad->r, cheie);
}
void Adauga(treap *& rad, treap * el)
{
    treap *l, *r;
    if(Cauta(rad, el->cheie)) ;
    else
    {
        nrel++;
       Split(rad, l, r, el->cheie);
       Merge(l, l, el);
       Merge(rad, l, r);
    }
}
void Sterge(treap *&rad, int cheie)
{
    if(!Cauta(rad, cheie)) fprintf(f2, "%d\n", -1);
    else
    {
        nrel--;
        treap *l, *r, *aux;
        Split(rad, rad, r, cheie);
        Split(rad, l, aux, cheie -1);
        Merge(rad, l, r); ///l- <=cheie-1, r- >cheie
    }
}
int Maxim(treap * rad)
{
    if(nrel<2) return -1;
    else return ((rad->maxi)-(rad->mini));
}
int Minim(treap * rad)
{
    if(nrel<2) return -1;
    else return rad->dfmin;
}
int main()
{
    treap *el;
    char sir[15];
    int nr;
    while(fgets(sir, 15, f1))
    {
        if(sir[0]!='M') nr=atoi(sir+2);
        if(sir[0]=='I') {Creare(el, nr); Adauga(rad, el);}
        if(sir[0]=='S') Sterge(rad, nr);
        if(sir[0]=='C') fprintf(f2, "%d\n", Cauta(rad, nr));
        if((sir[0]=='M')&&(sir[1]=='I')) fprintf(f2, "%d\n", Minim(rad));
        if((sir[0]=='M')&&(sir[1]=='A')) fprintf(f2, "%d\n", Maxim(rad));
    }
    return 0;
}