#include<cstdio>
#include<cstdlib>
#include<ctime>
using namespace std;
int Q, tip, x;
struct T
{
int K, P;
T *l, *r;
T (int K, int P, T *l, T *r)
{
this->l = l;
this->r = r;
this->K = K;
this->P = P;
}
}*R, *nil;
int Rand()
{
return (((rand()%(1<<14))<<14) + rand()%(1<<14));
}
void rotleft (T *&n)
{
T *t = n->l;
n->l = t->r, t->r = n;
n = t;
}
void rotright (T *&n)
{
T *t = n->r;
n->r = t->l, t->l = n;
n = t;
}
void balance (T *&n)
{
if (n->l->P > n->P) rotleft (n);
else
if (n->r->P > n->P) rotright (n);
}
bool Query (T *&n, int v)
{
if (n == nil) return 0;
if (n->K == v) return 1;
if (n->K > v) return Query (n->l, v);
return Query (n->r, v);
}
void Insert (T *&n, int v)
{
if (n == nil)
{
n = new T (v, Rand(), nil, nil);
return ;
}
if (n->K > v) Insert (n->l, v);
else Insert (n->r, v);
balance (n);
}
void Erase (T *&n, int v)
{
if (n->K > v) Erase (n->l, v);
else
if (n->K < v) Erase (n->r, v);
else
{
if (n->l == nil && n->r == nil)
delete n, n = nil;
else
{
if (n->l->P > n->r->P)
rotleft (n);
else
rotright (n);
Erase (n, v);
}
}
}
void afis (T *&n)
{
if (n == nil) return ;
afis (n->l);
printf ("%d ", n->K);
afis (n->r);
}
int main()
{
freopen ("hashuri.in", "r", stdin);
freopen ("hashuri.out", "w", stdout);
srand ( time (0) );
nil = new T (0, 0, 0, 0);
R = nil;
scanf ("%d", &Q);
while (Q)
{
Q--;
scanf ("%d %d", &tip, &x);
if (tip == 1)
{
if (!Query (R, x))
Insert (R, x);
}
else
if (tip == 2)
{
if (Query (R, x))
Erase (R, x);
}
else printf ("%d\n", Query (R, x));
//afis (R), printf ("\n");
}
return 0;
}