Cod sursa(job #786705)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 11 septembrie 2012 21:10:34
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 kb
#include <cstdio>
#include <set>
#include <map>
#include <algorithm>
#include <iterator>
#include <cstdlib>

using namespace std;

set<int> s;
map<int , int> m;
set<int>::iterator it, aux;
map<int , int>::iterator mit;
char sir[20]; int nr;

int main()
{
    freopen("zeap.in", "r", stdin);
    freopen("zeap.out", "w", stdout);
    while(gets(sir))
    {
        switch(sir[0])
        {
            case 'I':
            {
                nr = atoi(sir + 2);
                if(!s.count(nr))
                {
                    s.insert(nr);
                    it = s.upper_bound(nr);
                    if(it != s.end())
                        m[*it - nr]++;
                    --it;
                    if(it != s.begin())
                    {
                        --it;
                        m[nr - *it]++;
                    }
                }
                break;
            }
            case 'S':
            {
                nr = atoi(sir + 2);
                if(s.count(nr))
                {
                    it = s.upper_bound(nr);
                    aux = s.end();
                    if(it != s.end())
                    {
                        m[*it - nr]--;
                        if(!m[*it - nr]) m.erase(*it - nr);
                        aux = it;
                    }
                    --it;
                    if(it != s.begin())
                    {
                        --it;
                        m[nr - *it]--;
                        if(!m[nr - *it]) m.erase(nr - *it);
                        if(aux != s.end())
                            m[*aux - *it]++;
                    }
                    s.erase(nr);
                }
                else
                    printf("-1\n");
                break;
            }
            case 'C':
            {
                nr = atoi(sir + 2);
                printf("%d\n", s.count(nr));
                break;
            }
            default:
            {
                if(s.size() < 2)
                {
                    printf("-1\n");
                    break;
                }
                if(sir[1] == 'A')
                {
                    it = s.begin(), aux = s.end();
                    --aux;
                    printf("%d\n", *aux - *it);
                }
                else
                {
                    mit = m.begin();
                    printf("%d\n", mit->first);
                }
                break;
            }
        }
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}