#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;
}