#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 const SZ = 1e6;
char buffer [SZ];
int p;
int nextInt (){
while (! isdigit (buffer [p])){
++ p;
if (p == SZ){
fread (buffer , 1 , SZ , stdin);
p = 0;
}
}
int r = 0;
while (isdigit (buffer [p])){
r = r * 10 + (buffer [p] - '0');
++ p;
if (p == SZ){
fread (buffer , 1 , SZ , stdin);
p = 0;
}
}
return r;
}
int main()
{
freopen ("hashuri.in" , "r" , stdin);
freopen ("hashuri.out" , "w" , stdout);
// HashTable Hash;
int n;
fread (buffer , 1 , SZ , stdin);
n = nextInt ();
/* while (n --){
int type , value;
type = nextInt () , value = nextInt ();
if (type == 1)
Hash.add (value);
else
if (type == 2)
Hash.Remove (value);
else
printf ("%d\n" , Hash.is (value));
}*/
unordered_map <int , bool> M;
while (n --){
int a , b;
a = nextInt () , b = nextInt ();
if (a == 1)
M [b] = 1;
else
if (a == 2)
M [b] = 0;
else
if (! M [b])
printf ("%d\n" , 0);
else
printf ("%d\n" , 1);
}
return 0;
}