Cod sursa(job #1489629)

Utilizator thewildnathNathan Wildenberg thewildnath Data 21 septembrie 2015 19:23:58
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <cstdio>
#include <set>

using namespace std;

set<int> unSet;
multiset<int> dif;

void insereaza(int val) {
  set<int>::iterator it = unSet.find(val);
  if (it == unSet.end()) {
    unSet.insert(val);
    it = unSet.find(val);

    set<int>::iterator anterior = it;
    if (it == unSet.begin())
      anterior = unSet.end();
    else {
      --anterior;
      dif.insert(*it - *anterior);
    }

    set<int>::iterator succesor = it;
    ++succesor;
    if (succesor != unSet.end())
      dif.insert(*succesor - *it);

    if (anterior != unSet.end() && succesor != unSet.end())
      dif.erase(dif.find(*succesor - *anterior));
  }
}

int sterge(int val) {
  set<int>::iterator it = unSet.find(val);
  if (it == unSet.end())
    return -1;
  else {
    set<int>::iterator anterior = it;
    if (it == unSet.begin())
      anterior = unSet.end();
    else {
      --anterior;
      dif.erase(dif.find(*it - *anterior));
    }

    set<int>::iterator succesor = it;
    ++succesor;
    if (succesor != unSet.end())
      dif.erase(dif.find(*succesor - *it));

    if (anterior != unSet.end() && succesor != unSet.end())
      dif.insert(*succesor - *anterior);

    unSet.erase(it);
    return 0; // de ignorat
  }
}

int cauta(int val) {
  set<int>::iterator it = unSet.find(val);
  if (it == unSet.end())
    return 0;
  else
    return 1;
}

int max_dif() {
  if (unSet.size() < 2)
    return -1;
  else {
    int primul = *unSet.begin();
    int ultimul = *unSet.rbegin();
    return ultimul - primul;
  }
}

int min_dif() {
  if (unSet.size() < 2)
    return -1;
  else
    return *dif.begin();
}

void dump() {
  set<int>::iterator it;
  printf("unSet: ");
  for (it = unSet.begin(); it != unSet.end(); ++it)
    printf("%d ", *it);
  multiset<int>::iterator mit;
  printf("\ndif:    ");
  for (mit = dif.begin(); mit != dif.end(); ++mit)
    printf("%d ", *mit);
  printf("\n");
}

int main() {
  freopen("zeap.in", "r", stdin);
  freopen("zeap.out", "w", stdout);

  char ch;
  int val;

  while (scanf("%c", &ch) == 1) {
    if (ch == 'I') {
      scanf("%d\n", &val);
      insereaza(val);
    } else if (ch == 'S') {
      scanf("%d\n", &val);
      if (sterge(val) == -1)
        printf("-1\n");
    } else if (ch == 'C') {
      scanf("%d\n", &val);
      printf("%d\n", cauta(val));
    } else if (ch == 'M') {
      scanf("%c", &ch);
      if (ch == 'A')
        printf("%d\n", max_dif());
      else // if (ch == 'I')
        printf("%d\n", min_dif());
      scanf("%c\n", &ch);
    }
    //dump();
  }

  return 0;
}