Mai intai trebuie sa te autentifici.

Cod sursa(job #1161903)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 31 martie 2014 15:24:23
Problema Zeap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include<fstream>
#include<set>
#include<string.h>
#include<map>

using namespace std;


ifstream f("zeap.in");
ofstream g("zeap.out");

map<int,int >Dif;
string sir;
set < int > Q;
int n;
set<int >::iterator st,mid,dr;

void inserare(  int  x ){

    if(Q.find(x)!=Q.end())
        return ;

    if(Q.empty()){

        Q.insert(x);
        return ;
    }
    Q.insert(x);

    st=dr=mid=Q.find(x);

    ++dr;
    if( mid==Q.begin()  )
    {
        ++Dif[*dr-*mid];
        return ;
    }
    --st;
    if( dr== Q.begin ()){
        ++Dif[*mid-*st];
        return;
    }

    --Dif[*dr-*st];
    if(Dif[*dr*-*st]==0)
        Dif.erase(*st-*dr);

    ++Dif[*dr-*mid];
    ++Dif[*mid-*st];

}
int sterge( int x   )
{
    st=dr=mid=Q.find(x);

    if( mid==Q.end()    )
    {
        return -1;
    }
    ++dr;

    if(mid==Q.begin()  && dr==Q.end())
    {
        Q.erase(mid);
        return 0;
    }
    if(mid==Q.begin())
    {
        --Dif[*dr-*mid];
        if(Dif[*dr-*mid]==0)
            Dif.erase(*dr-*mid);

        return 0;
    }

    st--;

    if( dr==Q.end() )
    {
            --Dif[*mid-*st];
            if(Dif[*mid-*st]==0)
                Dif.erase(*mid-*st);

            return 0;
    }

    if(--Dif[*dr-*mid]==0)
        Dif.erase(*dr-*mid);

    if(--Dif[*mid-*st]==0)
        Dif.erase(*mid-*st);

    ++Dif[*dr-*st];
    return 0;
}
bool cauta (    int x   )
{
    mid=Q.find(x);
    return mid!=Q.find(x);
}
int dmax()
{
    if(Q.size()<2)
        return -1;
    int x=*Q.rbegin();
    int y=*Q.begin();
    return  x-y;
}
int dmin ()
{
    if(Dif.empty())
        return -1;
    return (*Dif.begin()).first;
}
int numar ()
{
    int nr=0;
    for(int i=2;i<sir.size();++i)
    {
        nr=nr*10+(sir[i]-48);
    }
    return nr;
}
int main () {

    while(getline(f,sir)){

        if(sir=="MIN")
        {
            g<<dmin()<<"\n";
            continue;
        }
        if(sir=="MAX"){
            g<<dmax()<<"\n";
            continue;
        }
        if(sir[0]=='I'){
            n=numar();
            inserare(n);
            continue;
        }
        if(sir[0]=='S'){
            n=numar();
            if(sterge(n)==-1)
                g<<-1<<"\n";
            continue;
        }
        if(sir[0]=='C'){
            n=numar();
            g<<cauta(n)<<"\n";
            continue;
        }

    }

    return 0;
}