Cod sursa(job #1740894)

Utilizator razvandRazvan Dumitru razvand Data 12 august 2016 14:25:05
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.58 kb
#include <iostream>
#include <fstream>
#include <map>
#include <set>
#include <cmath>

using namespace std;

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

map<int, int> mp;
set<int> S;
int id = 0;

void rem(int x) {

    if(S.size() == 1) {
        S.erase(S.begin());
        return;
    }

    if(S.size() == 2) {
        S.erase(x);
        mp[abs(*S.begin()-x)]--;
        return;
    }

    S.erase(x);
    set<int>::iterator it = S.lower_bound(x);
    set<int>::iterator en = it;
    advance(en, -1);

    if(it == S.end()) {
        mp[x-*en]--;
    } else if(it == S.begin()) {
        mp[*it-x]--;
    } else {
        mp[*it-*en]++;
        mp[x-*en]--;
        mp[*it-x]--;
    }

}

void ins(int x) {

    if(S.size() == 0) {
        S.insert(x);
        return;
    }

    if(S.size() == 1) {
        mp[abs(*S.begin()-x)]++;
        S.insert(x);
        return;
    }

    set<int>::iterator it = S.lower_bound(x);
    set<int>::iterator en = it;
    advance(en, -1);

    if(it == S.end()) {
        mp[x-*en]++;
        //cout << "T1 " << x << " " << en << '\n';
    } else if(it == S.begin()) {
        mp[*it-x]++;
        //cout << "T2 " << x << " " << it << '\n';
    } else {
        mp[*it-*en]--;
        mp[x-*en]++;
        mp[*it-x]++;
        //cout << "T3 " << x << " " << it << " " << en << '\n';
    }

    S.insert(x);

}

int main() {

    string a;
    int x;

    while(in >> a) {

        if(a == "I") {
            in >> x;
            if(S.find(x) == S.end())
                ins(x);
        }

        if(a == "S") {
            in >> x;
            if(S.find(x) != S.end()) {
                rem(x);
            } else {
                out << "-1" << '\n';
            }
        }

        if(a == "C") {
            in >> x;
            if(S.find(x) != S.end()) {
                out << "1" << '\n';
            } else {
                out << "0" << '\n';
            }
        }

        if(a == "MAX") {
            if(S.size() < 2) {
                out << "-1" << '\n';
            } else {
                set<int>::iterator it = S.end();
                advance(it, -1);
                out << *it-*S.begin() << '\n';
            }
        }

        if(a == "MIN") {
            while(mp.size() != 0 && mp.begin()->second == 0)
                mp.erase(mp.begin());
            if(mp.size() == 0) {
                out << "-1" << '\n';
            } else {
                out << mp.begin()->first << '\n';
            }
        }

    }

    return 0;
}