#include<bits/stdc++.h>
#define INF 1<<30
using namespace std;
int nodes;
char c;
int x;
struct Treap
{
int key,priority;
Treap *left,*right;
int minim,maxim,difmin;
Treap(int key,int priority,int minim,int maxim,int difmin,Treap *left,Treap *right)
{
this->key=key;
this->priority=priority;
this->left=left;
this->right=right;
this->maxim=maxim;
this->minim=minim;
this->difmin=difmin;
}
}*root, *empty;
inline void init()
{
srand(unsigned(time(0)));
root=empty=new Treap(0,0,INF,-INF,INF,NULL,NULL);
}
inline void Update(Treap* &node)
{
node->maxim=max(node->key,node->right->maxim);
node->minim=min(node->key,node->left->minim);
node->difmin=min(min(node->left->difmin,node->right->difmin),
min(abs(node->key-node->left->maxim),abs(node->key-node->right->minim)));
}
inline void RotLeft(Treap* &node)
{
Treap *t=node->left;
node->left=t->right;
t->right=node;
node=t;
if(node!=empty && node->right!=empty) Update(node->right);
}
inline void RotRight(Treap* &node)
{
Treap *t=node->right;
node->right=t->left;
t->left=node;
node=t;
if(node!=empty && node->left!=empty) Update(node->left);
}
inline void Balance(Treap* &node)
{
if(node->left->priority>node->priority) RotLeft(node);
else
if(node->right->priority>node->priority) RotRight(node);
Update(node);
}
inline void Insert(Treap* &node,int key,int priority)
{
if(node==empty)
{
node=new Treap(key,priority,key,key,INF,empty,empty);
nodes++;
return;
}
if(key<node->key) Insert(node->left,key,priority);
else Insert(node->right,key,priority);
Balance(node);
}
inline void Erase(Treap* &node,int key)
{
if(node==empty)
return;
if(key<node->key) Erase(node->left,key);
else
if(key>node->key) Erase(node->right,key);
else
{
if(node->left==empty && node->right==empty)
delete node,node=empty,nodes--;
else
{
if(node->left->priority>node->right->priority) RotLeft(node);
else RotRight(node);
Erase(node,key);
}
}
if(node!=empty)
Update(node);
}
inline int Search(Treap* node,int key)
{
if(node==empty) return 0;
if(node->key==key) return 1;
if(key<node->key) return Search(node->left,key);
if(key>node->key) return Search(node->right,key);
}
int main()
{
freopen("zeap.in","r",stdin);
freopen("zeap.out","w",stdout);
init();
while(!feof(stdin))
{
scanf("%c",&c);
if(c=='I')
{
scanf("%d",&x);
scanf("\n");
Insert(root,x,rand()%INF+1);
}
else
if(c=='S')
{
scanf("%d",&x);
scanf("\n");
if(Search(root,x)) Erase(root,x);
else printf("-1\n");
}
else
if(c=='C')
{
scanf("%d",&x);
scanf("\n");
printf("%d\n",Search(root,x));
}
else
if(c=='M')
{
scanf("%c",&c);
scanf("%c",&c);
scanf("\n");
if(nodes<2)
{
printf("-1\n");
}
else
{
if(c=='X')
printf("%d\n",root->maxim-root->minim);
else
printf("%d\n",root->difmin);
}
}
}
return 0;
}