Cod sursa(job #1527125)

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

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

#define INFINITY 1000000002
#define Smerenie 4

#define u32 unsigned int


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

void afis() {
  printf("Set-ul : ");
  for (it = sl.begin(); it != sl.end(); it++) {
    printf("%d, ",*it);
  }
  printf("\n");
}

void afismap() {
  printf("Mapul : ");
  for (itmap = m.begin(); itmap != m.end(); itmap++) {
    printf("%u, ", *itmap);
  }
  printf("\n");
}

int ABS(int X) {return X>0?X:-X;}

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

  sl.insert(-INFINITY);
  sl.insert(INFINITY);
  m.insert(INFINITY*2);

  /* Citeste operatiile. */
  while (fscanf(in, "%s", s) != EOF) {
    //printf("%c\n", s[0]);
    //afis();
    //afismap();
    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(ABS(e - b));
          itmap--;
          m.erase(itmap);
          sl.insert(x);
          m.insert(ABS(e - x));
          m.insert(ABS(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(ABS(e - x));
          itmap--;
          m.erase(itmap);
          itmap = m.upper_bound(ABS(x - b));
          itmap--;
          m.erase(itmap);
          m.insert(ABS(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;
}