Cod sursa(job #2144039)

Utilizator GoogalAbabei Daniel Googal Data 26 februarie 2018 14:52:11
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 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);

int n, pos;
set < int > s;
multiset < int > ms;
string a;
char v[100];

void get_op() {
  a.clear();
  pos = 0;
  n = strlen(v);

  while(pos < n && isalpha(v[pos])) {
    a += v[pos];
    pos++;
  }
}

void get_num(int &num) {
  num = 0;

  while(pos < n && !isdigit(v[pos]))
    pos++;

  while(pos < n && isdigit(v[pos])) {
    num = num * 10 + (v[pos] - '0');
    pos++;
  }
}

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


  while(in.getline(v, 100)) {
    //cout << v << '\n';
    //in >> a;
    get_op();
    if(a == "I") {
      int x;
      //in >> x;
      //in >> a;
      get_num(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;
      //in >> a;
      get_num(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;
      //in >> a;
      get_num(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;
}