Cod sursa(job #1740846)

Utilizator razvandRazvan Dumitru razvand Data 12 august 2016 13:05:54
Problema Zeap Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.87 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<pair<int, int>> S;
int id = 0;

void rem(int x) {

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

    if(S.size() == 2) {
        S.erase(S.lower_bound({x, 0}));
        mp[abs(S.begin()->first-x)]--;
        return;
    }

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

    if(it == S.end()) {
        mp[x-en->first]--;
    } else if(it == S.begin()) {
        mp[it->first-x]--;
    } else {
        //cout << "Test " << it->first << " " << en->first << '\n';
        mp[it->first-en->first]++;
        mp[x-en->first]--;
        mp[it->first-x]--;
    }

}

void ins(int x) {

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

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

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

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

    S.insert({x, id++});

}

int main() {

    string a;
    int x;

    while(in >> a) {

        if(a == "I") {
            in >> x;
            ins(x);
        }

        if(a == "S") {
            in >> x;
            if(S.lower_bound({x, 0})->first == x) {
                rem(x);
            } else {
                out << "-1" << '\n';
            }
        }

        if(a == "C") {
            in >> x;
            if(S.lower_bound({x, 0})->first == x) {
                out << "1" << '\n';
            } else {
                out << "0" << '\n';
            }
        }

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

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

    }

    return 0;
}