#include<fstream>
#include<cstring>
#include<algorithm>
#define inf 100000005
using namespace std;
ifstream f("zeap.in");
ofstream g("zeap.out");
char buff[20];
int com[300005][3];
int x,n,nrc,i,NrMax,poz,found;
struct element {int maxim; int minim; int dif;};
element tree[1050006];
int maximum(int xx, int yy)
{if(xx>yy)
return xx;
return yy;}
int minimum(int xx, int yy)
{if(xx<yy)
return xx;
return yy;}
void build(int nod, int left, int right)
{int mij=(left+right)/2;
tree[nod].maxim=-inf;
tree[nod].minim=inf;
tree[nod].dif=inf;
if(left==right)
return;
build(2*nod,left,mij);
build(2*nod+1,mij+1,right);
}
void update(int nod, int left, int right, int val)
{if(left==right)
{tree[nod].dif=inf;
if(val)
{tree[nod].maxim=val;
tree[nod].minim=val;}
else
{tree[nod].maxim=-inf;
tree[nod].minim=inf;}
return;}
int mij=(left+right)/2;
if(poz<=mij)
update(2*nod,left,mij,val);
else
update(2*nod+1,mij+1,right,val);
tree[nod].maxim=maximum(tree[2*nod].maxim,tree[2*nod+1].maxim);
tree[nod].minim=minimum(tree[2*nod].minim,tree[2*nod+1].minim);
tree[nod].dif=minimum(minimum(tree[2*nod].dif, tree[2*nod+1].dif), (tree[2*nod+1].minim-tree[2*nod].maxim));
}
int search(int nod, int left, int right, int val)
{if(left==right)
{if(tree[nod].maxim==val)
return 1;
else
return 0;}
int mij=(left+right)/2;
if(poz<=mij)
return search(2*nod,left,mij,val);
else
return search(2*nod+1,mij+1,right,val);
}
int get_number()
{int nrn=0;
while(buff[nrc]<='9' && buff[nrc]>='0')
{nrn=nrn*10+buff[nrc]-'0';
nrc++;}
return nrn;
}
void afisare()
{for(int jj=1; jj<=2*NrMax-1; jj++)
printf("%d ",tree[jj].maxim);
printf("\n");
}
int main()
{
n=0;
while(f.getline(buff,20))
{if(buff[0]=='I')
{n++;
com[n][0]=1;
nrc=2;
com[n][1]=get_number();
if(NrMax<com[n][1])
NrMax=com[n][1]; }
if(buff[0]=='S')
{n++;
com[n][0]=2;
nrc=2;
com[n][1]=get_number();}
if(buff[0]=='C')
{n++;
com[n][0]=3;
nrc=2;
com[n][1]=get_number();}
if(buff[2]=='N')
{n++;
com[n][0]=4;}
if(buff[2]=='X')
{n++;
com[n][0]=5;}
}
found=1;
found=0;
build(1,1,NrMax);
for(i=1; i<=n; i++)
{if(com[i][0]==1)
{poz=com[i][1];
update(1,1,NrMax,poz);}
if(com[i][0]==2)
{poz=com[i][1];
found=search(1,1,NrMax,poz);
if(!found)
g<<"-1"<<endl;
else
update(1,1,NrMax,0);
}
if(com[i][0]==3)
{poz=com[i][1];
found=search(1,1,NrMax,poz);
g<<found<<endl;
}
if(com[i][0]==4)
{found=tree[1].dif;
if(tree[1].maxim==tree[1].minim)
g<<"-1"<<endl;
else
g<<found<<endl;
}
if(com[i][0]==5)
{found=tree[1].maxim-tree[1].minim;
if(tree[1].maxim==tree[1].minim)
g<<"-1"<<endl;
else
g<<found<<endl;
}
//afisare();
}
f.close();
g.close();
return 0;}