#include<fstream>
#include<stdlib.h>
#include<time.h>
#define INF 1000000000
using namespace std;
int x, ok, n;
char c[10];
struct nod{
nod *st, *dr;
int maxim, minim, dif, val, vp;
nod(int val, int vp, int maxim, int minim, int dif, nod *st, nod *dr){
this->maxim = maxim;
this->minim = minim;
this->dif = dif;
this->val = val;
this->vp = vp;
this->st = st;
this->dr = dr;
}
};
nod *r, *nill;
ifstream fin("zeap.in");
ofstream fout("zeap.out");
void update(nod *r){
r->maxim = max(r->dr->maxim, r->val);
r->minim = min(r->st->minim, r->val);
r->dif = min( min(r->st->dif, r->dr->dif), min(r->val - r->st->maxim, r->dr->minim - r->val ) );
}
void rotst(nod * &r){
nod *aux = r->st;
r->st = aux->dr;
aux->dr = r;
r = aux;
update(r->dr);
update(r);
}
void rotdr(nod * &r){
nod *aux = r->dr;
r->dr = aux->st;
aux->st = r;
r = aux;
update(r->st);
update(r);
}
void gettr(nod * &r){
if(r->st->vp > r->vp){
rotst(r);
}
else{
if(r->dr->vp > r->vp){
rotdr(r);
}
}
}
void addtr(nod * &r, int x){
if(r == nill){
r = new nod(x, rand() + 1, x, x, INF, nill, nill);
n++;
}
else{
if(r->val > x){
addtr(r->st, x);
}
else{
addtr(r->dr, x);
}
gettr(r);
update(r);
}
}
void deltr(nod * &r, int x){
if(r != nill){
if(r->val == x){
ok = 1;
if(r->st == nill && r->dr == nill){
delete r;
r = nill;
n--;
}
else{
if(r->st->vp > r->dr->vp){
rotst(r);
}
else{
rotdr(r);
}
deltr(r, x);
}
}
else{
if(r->val > x){
deltr(r->st, x);
}
else{
deltr(r->dr, x);
}
}
if(r != nill){
update(r);
}
}
}
int srctr(nod *r, int x){
if(r->val == x){
return 1;
}
if(r == nill){
return 0;
}
if(r->val > x){
srctr(r->st, x);
}
else{
srctr(r->dr, x);
}
}
int main(){
srand( time(0));
r = nill = new nod(0, 0, -INF, INF, INF, NULL, NULL);
while(fin>> c + 1){
if(c[1] == 'M'){
if(n < 2){
fout<<"-1\n";
continue;
}
if(c[2] == 'A'){
fout<< r->maxim - r->minim <<"\n";
}
else{
fout<< r->dif <<"\n";
}
}
else{
fin>> x;
if(c[1] == 'I'){
addtr(r, x);
}
else{
if(c[1] == 'S'){
ok = 0;
deltr(r, x);
if(ok == 0){
fout<<"-1\n";
}
}
else{
fout<< srctr(r, x) <<"\n";
}
}
}
}
return 0;
}