Cod sursa(job #1827405)

Utilizator TincaMateiTinca Matei TincaMatei Data 11 decembrie 2016 19:59:58
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.01 kb
#include <cstdio>
#include <cstdlib>
#include <time.h>

const int INF = 2000000010;

FILE *fout;

inline int min(int a, int b) {
  if(a < b)
    return a;
  return b;
}

inline int max(int a, int b) {
  if(a > b)
    return a;
  return b;
}

typedef struct _Node {
  _Node *st, *dr;
  int pr, key, size, minK, maxK, mindif;
  _Node(int k) {
    st = dr = NULL;
    pr = rand() ^ rand();
    key = k;
    size = 1;
    minK = k;
    maxK = k;
    mindif = -1;
  }

  ~_Node() { delete st; delete dr; }

  void recalc() {
    size = 1;
    minK = key;
    maxK = key;
    mindif = INF;
    if(st != NULL) {
      size += st -> size;
      minK = min(minK, st -> minK);
      maxK = max(maxK, st -> maxK);
      mindif = min(min(mindif, st -> mindif), key - st -> maxK);
    }
    if(dr != NULL) {
      size += dr -> size;
      minK = min(minK, dr -> minK);
      maxK = max(maxK, dr -> maxK);
      mindif = min(min(mindif, dr -> mindif), dr -> minK - key);
    }
  }
} *Treap;

void recalc(Treap x) {
  if(x != NULL) x -> recalc();
}

void split(Treap x, int k, Treap &l, Treap &r) {
  l = r = NULL;
  if(x == NULL) return ;
  if(x -> key < k) {
    split(x -> dr, k, x -> dr, r);
    l = x;
    recalc(l);
  } else {
    split(x -> st, k, l, x -> st);
    r = x;
    recalc(r);
  }
}

Treap join(Treap l, Treap r) {
  if(l == NULL) return r;
  if(r == NULL) return l;
  recalc(l);
  recalc(r);
  if(l -> pr < r -> pr) {
    l -> dr = join(l -> dr, r);
    recalc(l);
    return l;
  } else {
    r -> st = join(l, r -> st);
    recalc(r);
    return r;
  }
}

Treap add(Treap t, int x) {
  Treap l, m, r, ret;
  split(t, x, l, m);
  split(m, x + 1, m, r);
  if(m == NULL) m = new _Node(x);
  ret = join(join(l, m), r);
  return ret;
}

Treap erase(Treap t, int x) {
  Treap l, m, r;
  split(t, x, l, m);
  split(m, x + 1, m, r);
  if(m == NULL) fprintf(fout, "-1\n");
  delete m;
  return join(l, r);
}

bool acces(Treap t, int x) {
  Treap l, m, r;
  bool rez = false;
  split(t, x, l, m);
  split(m, x + 1, m, r);
  if(m != NULL) rez = true;
  join(join(l, m), r);
  return rez;
}

int getSize(Treap x) {
  if(x == NULL) return 0;
  return x -> size;
}

const int MAX_C = 100;
char line[MAX_C];

int readNr() {
  int i = 2;
  int nr = 0;;
  while('0' <= line[i] && line[i] <= '9') {
    nr = nr * 10 + line[i] - '0';
    ++i;
  }
  return nr;
}

int main() {
  srand(time(NULL));
  int arg;
  Treap x;
  x = NULL;
  FILE *fin = fopen("zeap.in", "r");
  fout = fopen("zeap.out", "w");
  while(fgets(line, MAX_C, fin) != NULL) {
    if(line[0] == 'I') {
      arg = readNr();
      x = add(x, arg);
    } else if(line[0] == 'S') {
      arg = readNr();
      x = erase(x, arg);
    } else if(line[0] == 'C') {
      arg = readNr();
      fprintf(fout, "%d\n", acces(x, arg));
    } else if(line[0] == 'M') {
      if(getSize(x) >= 2) {
        if(line[1] == 'I')
          fprintf(fout, "%d\n", x -> mindif);
        else
          fprintf(fout, "%d\n", x -> maxK - x -> minK);
      } else
        fprintf(fout, "-1\n");
    }
  }
  fclose(fin);
  fclose(fout);
  return 0;
}