#include <cstdio>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <cstring>
#include <string>
#include <fstream>
#include <cassert>
using namespace std;
#define DIM2 8192
const int prime = 2000000011;
const int sz = 1004200;
//const int MAXSTEP = 7;
#define F1 (f_h1(a1, b1, prime, x, sz))
#define F2 (f_h1(a2, b2, prime, x, sz))
inline void cit(int &x, char *&vec, int &poz)
{
x = 0;
while(vec[poz] < '0' || vec[poz] > '9')
if(++poz == DIM2) fread(vec, 1, DIM2, stdin), poz=0;
while(vec[poz] >= '0' && vec[poz] <= '9')
{
x = x * 10 + vec[poz] - '0';
if(++poz == DIM2) fread(vec, 1, DIM2, stdin), poz=0;
}
}
inline bool insert(int *&h1, int *&h2, char *&v1, char *&v2 ,
int &a1, int &b1, int &a2, int &b2, int x) ;
bool deleteTable(int *&h1, int*&h2, char *&v1, char *&v2);
inline bool find( int *&h1, int *&h2, char *&v1, char *&v2, int a1, int b1, int a2, int b2, int x);
inline int f_h2(int a, int b, int prime, int val, int sz) {
return ( (long long) a * val / prime ) % sz;
}
inline int f_h1(int a, int b, int prime, int val, int sz) {
return ((1LL * a * val + b) % (prime) ) % (sz);
}
inline void createFunctions(int &a1, int &a2, int &b1, int &b2) {
a1 = rand() % sz;
a2 = rand() % sz;
b1 = rand() % sz;
b2 = rand() % sz;
}
inline void createTable(int *&h1, int *&h2, char *&v1, char *&v2, int n) {
h1 = new int[n];
h2 = new int[n];
for(int i = 0; i < n; ++i)
h1[i] = h2[i] = 0;
}
inline bool rehash( int *&h1, int *&h2, char *&v1, char *&v2,
int &a1, int &a2, int &b1, int &b2) {
createFunctions(a1, b1, a2, b2);
cerr << a1 << " " << b1 << " " << a2 << " " << b2 << " " << "\n";
int* hh1; int* hh2 ;
char* vv1; char* vv2 ;
createTable(hh1, hh2, vv1, vv2, sz);
for(int i = 0; i < sz; ++i) {
if(h1[i]) {
if( insert(hh1, hh2, vv1, vv2 , a1, b1, a2 , b2, h1[i] ) == false)
return deleteTable(hh1, hh2, vv1, vv2);
}
}
for(int i = 0; i < sz; ++i) {
if(h2[i]) {
if(insert(hh1, hh2, vv1, vv2, a1, b1, a2, b2, h2[i]) == false)
return deleteTable(hh1, hh2, vv1, vv2);
}
}
deleteTable(h1, h2, v1, v2);
h1 = hh1;
h2 = hh2;
return true;
}
inline bool insert( int *&h1, int *&h2,
char *&v1, char *&v2,
int &a1, int &b1,
int &a2, int &b2,
int x) {
int steps = 0;
int MAXSTEP = 30;
if(find(h1, h2, v1, v2, a1, b1, a2, b2, x) == true)
return true;
while(steps < MAXSTEP) {
int y;
steps += 2;
if( h1[F1] == 0) {
h1[F1] = x ;
return true;
}
y = h1[F1] ;
h1[F1] = x;
x = y;
if(h2[F2] == 0) {
h2[F2] = x;
return true;
}
y = h2[F2] ;
h2[F2] = x;
x = y;
}
return false;
}
inline bool find( int *&h1, int *&h2, char *&v1, char *&v2,
int a1, int b1, int a2, int b2, int x) {
return ( (h1[F1] == x) || (h2[F2] == x) ) ;
}
inline void sterge( int *&h1, int *&h2, char *&v1, char *&v2,
int a1, int b1, int a2, int b2, int x) {
if( h1[F1] == x) {
h1[F1] = 0;
return ;
}
if(h2[F2] == x) {
h2[F2] = 0;
return ;
}
}
bool deleteTable(int *&h1, int *&h2, char *&v1, char *&v2) {
delete[] h1 ;
delete[] h2 ;
return false;
}
int main() {
freopen("hashuri.in", "r", stdin);
ofstream fout("hashuri.out");
srand(time(NULL));
int a1, b1, a2, b2;
int *h1, *h2;
char *v1, *v2;
char *omg = new char[8192];
int poz = 0;
int Q, op, x;
createFunctions(a1, b1, a2, b2);
createTable(h1, h2, v1, v2, sz);
for( cit(Q, omg, poz); Q--; ) {
cit(op, omg, poz);
cit(x, omg, poz);
if(op == 1) {
while( insert(h1, h2, v1, v2, a1, b1, a2, b2, x) == false) {
for( ; rehash(h1, h2, v1, v2, a1, b1, a2, b2) == false; )
cerr << x << " " << F1 << " " << F2 << " " ;
}
}
if(op == 2) {
sterge(h1, h2, v1, v2,
a1, b1, a2, b2, x);
}
if(op == 3) {
fout << int(find(h1, h2, v1, v2, a1, b1, a2, b2, x)) << "\n";
}
}
deleteTable(h1, h2, v1, v2);
return 0;
}