Cod sursa(job #2143964)

Utilizator GoogalAbabei Daniel Googal Data 26 februarie 2018 13:50:15
Problema Zeap Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <algorithm>
#include <iostream>
#include <fstream>
#include <cstring>
#include <set>

using namespace std;

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

const int INF = (1 << 30);

set < int > s;
multiset < int > ms;
string a;

int main()
{
  s.insert(INF);
  s.insert(-INF);

  while(in >> a) {
    //in >> a;
    if(a == "I") {
      int x;
      in >> x;

      if(s.find(x) != s.end())
        continue;

      set < int > :: iterator it2 = s.upper_bound(x);
      set < int > :: iterator it1 = it2;
      it1--;

      s.insert(x);

      if(*it1 != -INF)
        ms.insert(x - *it1);
      if(*it2 !=  INF)
        ms.insert(*it2 - x);
      if(*it1 != -INF && *it2 != INF)
        ms.erase(ms.find(*it2 - *it1));
    } else if(a == "S") {
      int x;
      in >> x;

      if(s.find(x) == s.end()) {
        out << "-1\n";
      } else {
        s.erase(x);

        set < int > :: iterator it2 = s.upper_bound(x);
        set < int > :: iterator it1 = it2;
        it1--;

        if(*it1 != -INF)
          ms.erase(ms.find(x - *it1));
        if(*it2 !=  INF)
          ms.erase(ms.find(*it2 - x));
        if(*it1 != -INF && *it2 != INF)
          ms.insert(*it2 - *it1);

      }
    } else if(a == "C") {
      int x;

      in >> x;
      out << (s.find(x) != s.end()) << '\n';

    } else if(a == "MAX") {
      if(s.size() < 4) {
        out << "-1\n";
      } else {
        set < int > :: iterator minn = s.begin();
        set < int > :: iterator maxx = s.end();

        minn++;
        maxx--;
        maxx--;

        out << (*maxx - *minn) << '\n';
      }
    } else if(a == "MIN") {
      if(s.size() < 4) {
        out << "-1\n";
      } else {
        out << *ms.begin() << '\n';
      }
    }
  }

  in.close();
  out.close();
  return 0;
}