#include <bits/stdc++.h>
using namespace std;
void Resize (int *&V , int newm){
delete V;
V = new int [newm + 1];
memset (V , 0 , 4 * newm);
}
class HashTable{
public:
int *v , *flag , n = 0, m = 2;
int p1 = (int)1e9 + 7 , p2 = 666013;
int a1 , b1 , a2 , b2;
mt19937 rand;
bool isEmpty (){
return n == 0;
}
int Size (){
return n;
}
HashTable (){
v = new int [m + 1];
flag = new int [m + 1];
memset (v , 0 , 4 * m);
memset (flag , 0 , 4 * m);
getvalues (a1 , b1 , a2 , b2);
}
void getvalues (int &a , int &b , int &c , int &d){
uniform_int_distribution <int> m1 (1 , m);
a = m1 (rand) , b = m1 (rand) , c = m1 (rand) , d = m1 (rand);
return;
}
int h1 (int key){
return (1LL * a1 * key + b1) % p1;
}
int h2 (int key){
return ((1LL * a2 * key + b2) % p2) | 1;
}
int H (int key , int index){
int x = h1 (key);
int y = h2 (key);
int val = (1LL * x + 1LL * y * index) % m + 1;
return val;
}
int getpos (int key){
int i = 1 , p = H (key , 1);
while (flag [p] == 1){
++ i;
p = H (key , i);
}
return p;
}
void dResize (){
int cpm = m;
if (n > m / 2)
m = m * 2;
else
if (n <= m / 4)
m = m / 2 ;
else
return;
int *cp = new int [cpm] , *cp2 = new int [cpm];
for(int i = 1 ; i <= cpm ; ++ i){
cp [i] = v [i] , cp2 [i] = flag [i];
}
Resize (v , m) , Resize (flag , m);
getvalues (a1 , b1 , a2 , b2);
for(int i = 1 ; i <= cpm ; ++ i)
if (cp2 [i] == 1){
int p = getpos (cp [i]);
v [p] = cp [i];
flag [p] = 1;
}
return;
}
int findx (int key){
int i = 1 , p = H (key , 1);
while (flag [p] != 0 && i <= m){
if (flag [p] == 1 && v [p] == key)
return p;
++ i;
p = H (key , i);
}
return 0;
}
void add (int key){
if (findx (key) != 0)
return;
++ n;
int p = getpos (key);
v [p] = key;
flag [p] = 1;
dResize ();
return;
}
void Remove (int key){
if (isEmpty ())
return;
int p = findx (key);
if (p == 0)
return;
flag [p] = 2;
-- n;
dResize ();
}
bool is (int key){
return findx (key) != 0;
}
};
int main()
{
freopen ("hashuri.in" , "r" , stdin);
freopen ("hashuri.out" , "w" , stdout);
HashTable Hash;
int n;
scanf ("%d" , &n);
while (n --){
int type , value;
scanf ("%d%d" , &type , &value);
if (type == 1)
Hash.add (value);
else
if (type == 2)
Hash.Remove (value);
else
printf ("%d\n" , Hash.is (value));
}
return 0;
}