Cod sursa(job #900886)

Utilizator gabriel93Robu Gabriel gabriel93 Data 28 februarie 2013 22:30:42
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include<stdio.h>
#include<set>
#include<map>
using namespace std;
set<int> h;
map<int,int> m;

void add(int x)
{
    set<int>::iterator pos,prev,next;
    if(h.empty())
    {
        h.insert(x);
        return;
    }
    h.insert(x);
    pos=h.find(x);
    next=pos; ++next;
    prev=pos; --prev;
    if(pos==h.begin())
    {
        ++m[*next - *pos];
        return;
    }
    if(next==h.end())
    {
        ++m[*pos - *prev];
        return;
    }
    if(--m[*next - *prev]==0)
        m.erase(*next - *prev);
    ++m[*next - *pos];
    ++m[*pos - *prev];
}

void del(int x)
{
    set<int>::iterator pos,next,prev;
    pos=h.find(x);
    if(h.empty() || pos==h.end())
    {
        printf("-1\n");
        return;
    }
    next=pos; ++next;
    prev=pos; --prev;
    if(pos==h.begin() && next==h.end())
    {
        h.erase(x);
        return;
    }
    if(pos==h.begin())
    {
        if(--m[*next - *pos]==0)
            m.erase(*next - *pos);
            return;
    }
    if(next==h.end())
    {
        if(--m[*pos - *prev]==0)
            m.erase(*pos - *prev);
        return;
    }
    if(--m[*next - *pos]==0)
        m.erase(*next - *pos);
    if(--m[*pos - *prev]==0)
        m.erase(*pos - *prev);
    ++m[*next - *pos];
    h.erase(pos);
}

void caut(int x)
{
    set<int>::iterator pos;
    pos=h.find(x);
    if(pos==h.end())
    {
        printf("0\n");
        return;
    }
    printf("1\n");
}

void max()
{
    int min,max;
    min=*h.begin();
    max=*h.rbegin();
    printf("%d\n",max-min);
}

void min()
{
    printf("%d\n",m.begin()->first);
}

void rezolv()
{
    char s[50];
    int x,i;
    while(fgets(s,50,stdin))
    {
        if(s[0]=='M')
        {
            if(h.size()<2)
            {
                printf("-1\n");
                continue;
            }
            if(s[1]=='A')
                max();
            else
                min();
        }
        else
        {
            x=0;
            for(i=2;s[i]!='\n'&&s[i]!=0;++i)
                x=x*10+s[i]-'0';
            if(s[0]=='I')
            {
                add(x);
                continue;
            }
            if(s[0]=='C')
            {
                caut(x);
                continue;
            }
            del(x);
        }
    }
}

int main()
{
    freopen("zeap.in","r",stdin);
    freopen("zeap.out","w",stdout);
    rezolv();
    fclose(stdin);
    fclose(stdout);
    return 0;
}