#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int NM = 1200000;
const int NUM = 300000;
const int INF = 0x3f3f3f3f;
const int MOD = 666013;
int mx[NM], mn[NM], Dm[NM];
int st[NUM+5], K, Val1, Val2, poz, PPZ;
char s[20];
typedef struct lnod{
int vf,poz;
lnod *next;
}*Nod;
struct quad{
char T;
int val,index,poz;
}query[NUM+5];
bool cmp(const quad &a, const quad &b){
return a.index < b.index;
}
bool cmp2(const quad &a, const quad &b){
if(a.T != b.T) return a.T < b.T;
return a.val < b.val;
}
Nod h[MOD];
void add(Nod &q, int vf, int poz){
Nod p = new lnod;
p->vf = vf;
p->poz = poz;
p->next = q;
q = p;
}
bool find(int val){
for(Nod p = h[val % MOD]; p; p=p->next)
if(p->vf == val) return 1;
return 0;
}
int deleter(int val){
int x = val % MOD;
for(Nod p = h[x],prec=0; p; prec=p, p=p->next)
if(p->vf == val)
{
if(h[x] == p) h[x] = h[x]->next;
else
if(p->next == NULL) prec->next = NULL;
else
prec->next = p -> next;
return p->poz;
}
return 0;
}
int abs2(int x) { return (x<0) ? -x : x; }
void build(int nod, int l, int r){
if(l == r)
{
mn[nod] = Dm[nod] = INF;
mx[nod] = -INF;
return ;
}
int div = (l+r) / 2;
build(2*nod,l,div);
build(2*nod+1,div+1,r);
Dm[nod] = min(Dm[2*nod], Dm[2*nod+1]);
if(mn[2*nod] != INF && mn[2*nod+1] != INF) Dm[nod] = min(Dm[nod], abs2(mx[2*nod] - mn[2*nod+1]));
mx[nod] = max(mx[2*nod], mx[2*nod+1]);
mn[nod] = min(mn[2*nod], mn[2*nod+1]);
}
void update(int nod, int l, int r){
if(l == r)
{
mn[nod] = Val1;
mx[nod] = Val2;
return ;
}
int div = (l+r) / 2;
if(poz <= div)
update(2*nod, l, div);
else
update(2*nod+1, div+1, r);
Dm[nod] = min(Dm[2*nod], Dm[2*nod+1]);
if(mn[2*nod] != INF && mn[2*nod+1] != INF) Dm[nod] = min(Dm[nod], abs2(mx[2*nod] - mn[2*nod+1]));
mx[nod] = max(mx[2*nod], mx[2*nod+1]);
mn[nod] = min(mn[2*nod], mn[2*nod+1]);
}
int main(){
freopen("zeap.in","r",stdin);
freopen("zeap.out","w",stdout);
int i,x=0,nr=0,M;
build(1,1,NUM);
for(i=NUM;i>0;--i) st[NUM-i+1] = i;
K = NUM;
i = 0;
while(scanf("%s",s) != EOF)
{
++i;
if(s[0] == 'I' || s[0] == 'S' || s[0] == 'C')
{
if(s[0] == 'I') query[i].T = 'A';
if(s[0] == 'S') query[i].T = 'S';
if(s[0] == 'C') query[i].T = 'C';
scanf("%d",&x);
query[i].val = x;
}
else
{
if(s[1] == 'A') query[i].T = 'X';
if(s[1] == 'I') query[i].T = 'N';
}
query[i].index = i;
}
M = i;
sort(query+1, query+i+1, cmp2);
for(i=1; i<=M && query[i].T == 'A'; ++i)
{
query[i].poz = i;
}
sort(query+1, query+M+1, cmp);
for(i=1;i<=M;++i)
{
if(query[i].T == 'A')
{
x = query[i].val;
poz = query[i].poz;
if(!find(x))
{
add(h[x%MOD],x, poz);
Val1 = Val2 = x;
update(1,1,NUM);
nr ++;
}
}
else
if(query[i].T == 'S')
{
x = query[i].val;
if(find(x))
{
poz = deleter(x);
Val1 = INF;
Val2 = - INF;
update(1,1,NUM);
nr --;
}
else
printf("-1\n");
}
else
if(query[i].T == 'C')
{
x = query[i].val;
if(find(x)) printf("1\n");
else printf("0\n");
}
else
if(query[i].T == 'X')
{
if(nr > 1)
{
printf("%d\n",mx[1] - mn[1]);
}
else printf("-1\n");
}
else
{
if(nr > 1)
{
printf("%d\n",Dm[1]);
}
else printf("-1\n");
}
memset(s,0,sizeof(s));
}
return 0;
}