#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
ifstream fi("zeap.in");
ofstream fo("zeap.out");
typedef struct Treap {
int key, prio, mn, mx, dif;
Treap *l, *r;
Treap(int x) { key = x, prio = rand() + 1, mn = x, mx = x, dif = INF, l = r = 0; }
void update() {
if (this == 0) return;
mn = mx = key, dif = INF;
if (l) mn = l->mn, dif = min({dif, l->dif, key - l->mx});
if (r) mx = r->mx, dif = min({dif, r->dif, r->mn - key});
}
} *T;
T Merge (T l, T r) {
if (!l) return r;
if (!r) return l;
l->update(), r->update();
if (l->prio >= r->prio) {
l->r = Merge(l->r,r);
l->r->update();
l->update();
return l;
} else {
r->l = Merge(l,r->l);
r->l->update();
r->update();
return r;
}
}
void Split(T n, int x, T &l, T &r) {
l = r = 0;
if (!n) return;
if (n->key < x) {
Split(n->r,x,n->r,r);
l = n;
} else {
Split(n->l,x,l,n->l);
r = n;
}
if (l) l->update();
if (r) r->update();
}
T Delete(T n, int x) {
T l, m, r;
Split(n,x,l,m);
Split(m,x+1,m,r);
if (!m) fo << "-1\n";
return Merge(l,r);
}
T Add(T n, int x) {
T l, m, r;
Split(n,x,l,m);
Split(m,x+1,m,r);
if (m) return Merge(Merge(l,m),r);
else return Merge(Merge(l,new Treap(x)),r);
}
bool Get(T &n, int x) {
T l, m, r;
Split(n,x,l,m);
Split(m,x+1,m,r);
n = Merge(Merge(l,m),r);
if (m) return 1;
else return 0;
}
int main() {
T root = 0;
string s;
while (fi >> s) {
if (s.size() > 1) {
if (!root || root->mx == root->mn) fo << "-1\n";
else if (s == "MAX") fo << root->mx - root->mn << '\n';
else fo << root->dif << '\n';
} else {
int x;
fi >> x;
if (s == "I") root = Add(root,x);
else if (s == "S") root = Delete(root,x);
else fo << Get(root,x) << '\n';
}
}
}