Cod sursa(job #1808166)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 17 noiembrie 2016 13:58:01
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.8 kb
#include <iostream>
#include <cstdio>
#include <set>
#include <map>

using namespace std;

char buf[30];
set<int> data;
map<int, int> dif;
set<int>::iterator it1, it2, it3;

void debug()
{
    for (auto it = dif.begin(); it != dif.end(); ++it)
        cerr << it->first << ":" << it->second << " ";
    cerr << "\n";
}

inline void delOne(map<int, int> &s, int val)
{
    int k = (--s[val]);
    if (k == 0)
        s.erase(val);
}

int main()
{
    freopen("zeap.in", "r", stdin);
    freopen("zeap.out", "w", stdout);

    while (gets(buf))
    {
        if (buf[0] == 'M') {
            if (buf[1] == 'A') {
                if (data.size() < 2) {
                    printf("-1\n");
                    continue;
                }
                it2 = data.end(); it2--;
                printf("%d\n", *it2 - *data.begin());
            }
            else {
                if (data.size() < 2) {
                    printf("-1\n");
                    continue;
                }
                printf("%d\n", dif.begin()->first);
            }
        }
        else {
            int nr = 0;
            for (int i = 2; buf[i] >= '0' && buf[i] <= '9'; i++)
                nr = nr*10 + buf[i]-'0';
            if (buf[0] == 'I') {
                pair<set<int>::iterator, bool> p = data.insert(nr);
                if (p.second == true) {
                    it2 = it1 = p.first;
                    ++it2;
                    if (it2 != data.end()) {
                        dif[*it2 - nr]++;
                        if (it1 == data.begin()) continue;
                        it1--;
                        delOne(dif, *it2 - *it1);
                    }
                    it2--;
                    if (it2 == data.begin()) continue;
                    it2--;
                    dif[nr - *it2]++;
                }
            }
            else if (buf[0] == 'S') {
                it1 = data.find(nr);;
                if (it1 == data.end()) printf("-1\n");
                else
                {
                    data.erase(it1);
                    if (data.size() == 0) continue;

                    it2 = data.upper_bound(nr);
                    if (it2 != data.end())
                        delOne(dif, *it2-nr);
                    if (it2 != data.begin())
                    {
                        --it2;
                        delOne(dif, nr - *it2);
                        int val = *it2;
                        ++it2;
                        if (it2 != data.end())
                            dif[*it2 - val]++;
                    }
                }
            }
            else if (buf[0] == 'C') {
                printf("%d\n", data.find(nr) != data.end());
            }
        }
        //debug();
    }

    return 0;
}