Cod sursa(job #2323536)

Utilizator lucametehauDart Monkey lucametehau Data 19 ianuarie 2019 12:10:43
Problema Zeap Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <fstream>
#include <set>
#define its set <int> :: iterator

using namespace std;

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

set <int> zeap;
multiset <int> zeapmin;

string s;
int x, cnt;

bool search(int x) {
  return (zeap.find(x) != zeap.end() ? 1 : 0);
}

void rem(its it, its it2, its it3) {
  its i = zeapmin.find(*it - *it2), end = zeapmin.end();
  if(it != zeap.begin() && i != end)
    zeapmin.erase(i);
  its j = zeapmin.find(*it3 - *it), end2 = zeapmin.end();
  if(it3 != zeap.end() && j != end2)
    zeapmin.erase(j);
}

int main() {
  while(cin >> s) {
    cnt++;
    if(s == "I") {
      cin >> x;
      if(search(x))
        cout << "-1\n";
      else {
        zeap.insert(x);
        its it = zeap.find(x), it2 = it, it3 = it; it2--; it3++;
        if(it != zeap.begin())
          zeapmin.insert(*it - *it2);
        if(it3 != zeap.end())
          zeapmin.insert(*it3 - *it);
      }
    } else if(s == "S") {
      cin >> x;
      if(!search(x))
        cout << "-1\n";
      else {
        its it = zeap.find(x), it2 = it, it3 = it; it2--; it3++;
        rem(it, it2, it3);
        if(it != zeap.begin() && it3 != zeap.end())
          zeapmin.insert(*it3 - *it2);
        zeap.erase(x);
      }
    } else if(s == "C") {
      cin >> x;
      cout << search(x) << "\n";
    } else if(s == "MAX") {
      its it, it2;
      if(zeap.size()) {
        it = zeap.end(); it--;
        it2 = zeap.begin();
      }
      cout << (zeap.size() < 2 ? -1 : *it - *it2) << "\n";
    } else {
      cout << (zeap.size() < 2 ? -1 : *(zeapmin.begin())) << "\n";
    }
  }
  return 0;
}