#include <algorithm>
#include <fstream>
using namespace std;
const char iname[] = "zeap.in";
const char oname[] = "zeap.out";
#define MAX_N 300001
#define MAX_BUF 4000000
#define INF (int(1e9))
#define left (n << 1)
#define right (left + 1)
#define mid ((st + dr) >> 1)
int H[MAX_N]; // heap
int A[MAX_N], X[MAX_N];
int T[MAX_N * 3], Min[MAX_N * 3], Max[MAX_N * 3], MaxDif[MAX_N * 3], MinDif[MAX_N * 3];
int LOG, V;
char buf[MAX_BUF];
streampos size;
void read(){
fstream file(iname, ios::in | ios::binary | ios::ate);
size = file.tellg();
file.seekg(0, ios::beg);
file.read(buf, size);
file.close();
}
inline bool isnum(const char z) {
return ('0' <= z && z <= '9');
}
inline bool ischar(const char z) {
return ('A' <= z && z <= 'Z');
}
void rebuild(int H[], int z)
{
int l, r, k;
for (;;) {
l = 2 * z;
r = 2 * z + 1;
k = z;
if (l <= H[0] && H[l] < H[k])
k = l;
if (r <= H[0] && H[r] < H[k])
k = r;
if (k == z)
return;
H[k] ^= H[z] ^= H[k] ^= H[z], z = k;
}
}
void insert(int H[], const int V)
{
int k;
for (k = (++H[0]); k > 1 && H[k >> 1] > V; k >>= 1)
H[k] = H[k >> 1];
H[k] = V;
}
int getmin(int H[])
{
int min = H[1];
H[1] = H[(H[0]--)];
if (H[0] > 1)
rebuild(H, 1);
return min;
}
int search(const int A[], const int V)
{
int k;
int step = LOG;
for (k = 0; step; step >>= 1)
if (k + step <= A[0] && A[k + step] < V)
k += step;
return (k + 1);
}
void update(int n, int st, int dr, int p)
{
if (st == dr) {
if (X[p] == 1) T[n] += 1, Min[n] = Max[n] = V;
else T[n] -= 1;
return;
}
if (p <= mid) update(left, st, mid, p);
else update(right, mid + 1, dr, p);
T[n] = T[left] + T[right];
if (!T[n]) return;
Max[n] = T[right] ? Max[right] : Max[left];
Min[n] = T[left] ? Min[left] : Min[right];
if (T[left] && T[right])
MaxDif[n] = Max[right] - Min[left],
MinDif[n] = Min[right] - Max[left];
if (T[left] > 1 && T[right] > 1)
MaxDif[n] = max(MaxDif[n], max(MaxDif[left], MaxDif[right])),
MinDif[n] = min(MinDif[n], min(MinDif[left], MinDif[right]));
if (!T[left])
MaxDif[n] = MaxDif[right], MinDif[n] = MinDif[right];
else if(!T[right]) MaxDif[n] = MaxDif[left], MinDif[n] = MinDif[left];
}
int main(void)
{
fstream fout(oname, ios::out);
read();
int len, k;
char * p, *lim, ch;
len = (int)size;
for (p = buf, lim = buf + len; p < lim;) {
for (; p < lim && !isnum(*p); ++p);// <--
if (p < lim) {
for (V = 0; p < lim && isnum(*p); ++p)
V = V * 10 + (*p) - '0';
insert(H, V);
}
}
for (; H[0] > 0;) {
A[(++A[0])] = getmin(H);
if (A[0] > 1 && A[A[0]] == A[A[0] - 1])
A[0] -= 1;
}
for (LOG = 1; LOG <= A[0]; LOG <<= 1);// <--
for (p = buf, lim = buf + len; p < lim;) {
for (; p < lim && !isnum(*p) && !ischar(*p); ++p);// <--
if (p == lim)
break;
if ((*p) == 'I' || (*p) == 'S' || (*p) == 'C') {
ch = (*p);
for (; p < lim && !isnum(*p); ++p);// <--
for (V = 0; p < lim && isnum(*p); ++p)
V = V * 10 + (*p) - '0';
k = search(A, V);
if (ch == 'I') {
if (X[k] == 0)
X[k] = 1, update(1, 1, A[0], k);
}
else if (ch == 'S') {
if (X[k] == 1)
X[k] = 0, update(1, 1, A[0], k);
else fout << "-1\n";
}
else fout << X[k] << "\n";
}
else {
if (T[1] > 1) {
if ((*(p + 1)) == 'A') /* MAX */
fout << MaxDif[1] << "\n";
else fout << MinDif[1] << "\n";
}
else fout << "-1\n";
p += 3;
}
}
return 0;
}