#include <iostream>
#include <fstream>
#include <cstdio>
#include <climits>
using namespace std;
ifstream fin("zeap.in");
ofstream fout("zeap.out");
char Q1[20];
struct Pair{
char c;
int long long val;
};
struct Str{
int long long mn, mx;
int long long l, r;
int long long val;
};
Pair Order[300001];
int long long List[300001], Poz[300001], Inv[300001];
int V, P, i;
class BTree{
Str Vct[1200001];
Str Calc(Str A, Str B){
Str C;
if(A.l==0 && B.l==0){C.l=C.r=C.mn=C.mx=0; C.val=INT_MAX;}
else if(A.l==0) C=B;
else if(B.l==0) C=A;
else{
C.l=A.l; C.r=B.r;
C.mn=min(A.mn, B.mn); C.mx=max(A.mx, B.mx);
C.val=min(min(A.val, B.val), max(A.r, B.l)-min(A.r, B.l));
}
return C;
}
void Change(int long long val, int target, int a, int b, int position){
int mid=(a+b)/2;
if(a==b) {if(Vct[position].l==0 && val==0)fout<<"-1\n"; else {Vct[position].l=Vct[position].r=Vct[position].mn=Vct[position].mx=val; Vct[position].val=INT_MAX;} return;}
if(target<=mid) Change(val, target, a, mid, 2*position);
else Change(val, target, mid+1, b, 2*position+1);
Vct[position]=Calc(Vct[2*position], Vct[2*position+1]);
return;
}
public:
void Set(int long long val, int target){
Change(val, target, 1, P, 1);
return;
}
void Max(){
fout<<Vct[1].mx-Vct[1].mn<<"\n";
return;
}
void Min(){
fout<<Vct[1].val<<"\n";
return;
}
};
BTree Arb;
void QSort(int S, int D);
int Arrange(int S, int D);
int BS(int S, int D, int val);
int main()
{
while(fin.getline(Q1, 20)){
if(Q1[0]=='I' || Q1[0]=='S' || Q1[0]=='C'){
int i=2, nr=0;
while(Q1[i]>='0' && Q1[i]<='9') {nr=nr*10+(Q1[i]-'0'); ++i;}
Order[++V].c=Q1[0]; Order[V].val=nr;
}
else if(Q1[0]=='M'){
if(Q1[2]=='X') Order[++V].c='X';
else Order[++V].c='N';
}
}
for(i=1; i<=V; ++i) if(Order[i].c=='I'){List[++P]=Order[i].val; Poz[i]=P; Inv[P]=i;}
QSort(1, P); int p=0;
for(i=1; i<=V; ++i){
if(Order[i].c=='I') Arb.Set(Order[i].val, Poz[Inv[++p]]);
else if(Order[i].c=='S'){
int x=BS(1, P, Order[i].val);
if(x==0) fout<<"-1\n";
else Arb.Set(0, x);
}
else if(Order[i].c=='C'){
int x=BS(1, P, Order[i].val);
fout<<(x==0?0:1)<<"\n";
}
else if(Order[i].c=='X') Arb.Max();
else Arb.Min();
}
return 0;
}
void QSort(int S, int D){
if(S<D){
int p=Arrange(S, D);
QSort(S, p-1);
QSort(p+1, D);
}
return;
}
int Arrange(int S, int D){
int pS=0, pD=1;
while(S<D){
if(List[S]>List[D]){
swap(List[S], List[D]);
swap(Poz[Inv[S]], Poz[Inv[D]]);
swap(pS, pD);
}
S+=pS;
D-=pD;
}
return S;
}
int BS(int S, int D, int val){
int mid=(S+D)/2;
if(S==D && List[S]!=val) return 0;
if(val==List[mid]) return mid;
if(val<List[mid]) return BS(S, mid, val);
if(val>List[mid]) return BS(mid+1, D, val);
return 0;
}