Cod sursa(job #1526976)

Utilizator stoianmihailStoian Mihail stoianmihail Data 17 noiembrie 2015 18:48:47
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.56 kb
#include <set>
#include <map>
#include <stdio.h>

using std::set;
using std::multiset;

#define INFINITY 2000000002
#define Smerenie 4

#define u32 unsigned int

set <int> sl;
char s[Smerenie];
set <int>::iterator it;
multiset <u32> m;
multiset <u32>::iterator itmap;

int main(void) {
  int x, b, e, result;
  FILE *in = fopen("zeap.in","r");
  FILE *out = fopen("zeap.out","w");

  sl.insert(-INFINITY / 2);
  sl.insert(INFINITY);
  m.insert((u32)(INFINITY + INFINITY / 2));

  /* Citeste operatiile. */
  while (fscanf(in, "%s", s) != EOF) {
    switch (s[0]) {
      /* Inserare. */
      case 'I':
        fscanf(in, "%d", &x);
        it = sl.upper_bound(x);
        it--;
        if (*it != x) {
          it++;
          e = *it;
          it--;
          b = *it;
          itmap = m.upper_bound((u32)(e - b) );
          itmap--;
          m.erase(itmap);
          sl.insert(x);
          m.insert((u32)(e - x));
          m.insert((u32)(x - b));
        }
        break;
      /* Stergere. */
      case 'S':
        fscanf(in, "%d", &x);
        it = sl.upper_bound(x);
        it--;
        if (*it == x) {
          it++;
          e = *it;
          it--;
          it--;
          b = *it;
          it++;
          sl.erase(it);
          itmap = m.upper_bound((u32)(e - x));
          itmap--;
          m.erase(itmap);
          itmap = m.upper_bound((u32)(x - b));
          itmap--;
          m.erase(itmap);
          m.insert((u32)(e - b));
        } else {
          fprintf(out,"-1\n");
        }
        break;
      /* Cautare. */
      case 'C':
        fscanf(in, "%d", &x);
        it = sl.upper_bound(x);
        it--;
        if (*it == x) {
          fprintf(out, "1\n");
        } else {
          fprintf(out,"0\n");
        }
        break;
      /* Caracter 'M'. **/
      case 'M':
        switch (s[1]) {
          /* Diferenta maxima. */
          case 'A':
            if (sl.size() < Smerenie) {
              fprintf(out, "-1\n");
            } else {
              it = sl.end();
              it--;
              it--;
              result = *it;
              it = sl.begin();
              it++;
              result -= *it;
              fprintf(out, "%d\n", result);
            }
            break;
          /* Diferenta minima. */
          case 'I':
            if (sl.size() < Smerenie) {
              fprintf(out, "-1\n");
            } else {
              itmap = m.begin();
              fprintf(out, "%d\n", *itmap);
            }
            break;
      }
    }
  }
  fclose(in);
  fclose(out);

  /// Multumim Doamne!
  puts("Doamne ajuta!");
  return 0;

}