Cod sursa(job #1174784)

Utilizator nod_softwareBudisteanu Ionut Alexandru nod_software Data 23 aprilie 2014 22:02:33
Problema Zeap Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Semestrul 2 Marime 4.16 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>

using namespace std;

#define Inf 0x3f3f3f3f

class TSolution
{
    public:
        void Insert(int iValue);
        void Delete(int iValue);
        void Search(int iValue);
        void Min_dif();
        void Max_dif();
    public:
        int m_iNr;
        set<int> m_vZeap;
    protected:
        multiset<int> m_vZ;

};

 //-----------------------------------------------------------------
void TSolution::Insert(int iValue)
{
    set<int> :: iterator it,i1,i2;

    if (m_vZeap.size()==0)
    {
        m_vZeap.insert(iValue);
        return ;
    }

    i2=m_vZeap.lower_bound(iValue);
    if (*i2==iValue)
        return;
    i1=i2;
    if (i1!=m_vZeap.begin())
        --i1;
    if (i2!=m_vZeap.end())
        m_vZ.insert(abs(*i2-iValue));
    if (i1!=i2)
        m_vZ.insert(abs(*i1-iValue));

    m_vZeap.insert(iValue);//insereaza
}
 //-----------------------------------------------------------------
void TSolution::Delete(int iValue)
{
    set<int> :: iterator it,it1,it2;
    multiset<int> :: iterator a1,a2;

    it=m_vZeap.find(iValue);

    if (it==m_vZeap.end())//nu l-am gasit
    {
        printf("-1\n");
        return;
    }

    it1=it;

    if (it1!=m_vZeap.begin())
        --it1;
    it2=it;
    ++it2;
    if (it2!=m_vZeap.end())
        m_vZ.erase(m_vZ.find(abs(*it2-iValue)));
    if (it1!=it)
        m_vZ.erase(m_vZ.find(abs(iValue-*it1)));

    if (it2!=m_vZeap.end() && it1!=it)
        m_vZ.insert(*it2-*it1);
    m_vZeap.erase(*it); //sterge
}
 //-----------------------------------------------------------------
void TSolution::Search(int iValue)
{
    set<int> :: iterator it;

    it=m_vZeap.find(iValue);
    if (it==m_vZeap.end())
        printf("0\n");
    else
        printf("1\n");
}
 //-----------------------------------------------------------------
void TSolution::Max_dif()
{
    set<int> :: iterator it,it2;

    it=m_vZeap.end();
    --it;
    it2=m_vZeap.begin();//ultimul-primul
    printf("%d\n", *it-*(m_vZeap.begin()));
}
 //-----------------------------------------------------------------
void TSolution::Min_dif()
{
     printf("%d\n",*(m_vZ.begin()));
}
 //-----------------------------------------------------------------
int main()
{
    int i,x;
    freopen("zeap.in","r",stdin);
    freopen("zeap.out","w",stdout);

    TSolution * objSolution = new TSolution();
    //memset(zeap,0,sizeof(zeap));
    objSolution->m_iNr=0;

    char czString[20];

    while(gets(czString))
    {
        //gets(s);
        i=0;
        if (czString[0]=='I')//insert
        {
            i=2;
            x=0;
            while(czString[i]>='0' && czString[i]<='9')
            {
                x=x*10+czString[i]-'0';
                i++;
            }
            objSolution->Insert(x);
        }
        else
        if (czString[0]=='S')//sterge
        {
            i=2;
            x=0;
            while(czString[i]>='0' && czString[i]<='9')
            {
                x=x*10+czString[i]-'0';
                i++;
            }
            objSolution->Delete(x);
                //printf("-1\n");

        }
        else
        if (czString[0]=='C')//cauta
        {
            i=2;
            x=0;
            while(czString[i]>='0' && czString[i]<='9')
            {
                x=x*10+czString[i]-'0';
                i++;
            }
            //printf("%ld\n", cauta(x));
            objSolution->Search(x);
        }
        else
        if (czString[0]=='M' && czString[1]=='A')//max
        {
            if (objSolution->m_vZeap.size()<2)
                printf("-1\n");
            else
                //printf("%d\n", max_dif());
                objSolution->Max_dif();
        }
        else
        if (czString[0]=='M' && czString[1]=='I')//min
        {
            if (objSolution->m_vZeap.size()<2)
                printf("-1\n");
            else
                //printf("%d\n", min_dif());
                objSolution->Min_dif();
        }
    }

    fclose(stdin);
    fclose(stdout);

    return 0;
}