#include <iostream>
#include <fstream>
//#include <algorithm>
using namespace std;
#define prim 666013
struct node {
int val;
node *next, *prev;
};
struct Deque {
node *p, *u;
};
//int n, op, x;
Deque H[666015];
//void insereaza(lista& L, const int& x)
void Insert(Deque& deq, int& x) {
node *aux;
aux = new node;
aux->val = x;
aux->next = NULL;
aux->prev = deq.u;
if(deq.p == NULL) {
deq.p = aux;
deq.u = aux;
aux = NULL;
} else {
deq.u->next = aux;
deq.u = aux;
}
}
//void Delete(Deque& deq, const int& x) {
void Delete(Deque& deq, int& x) {
if(deq.p != NULL && deq.p->val == x) {
if(deq.p == deq.u) {
delete deq.p;
deq.p = NULL;
deq.u = deq.p;
} else {
deq.p = deq.p->next;
delete deq.p->prev;
deq.p->prev = NULL;
}
return;
}
if(deq.u != NULL && deq.u->val == x) {
deq.u = deq.u->prev;
delete deq.u->next;
deq.u->next = NULL;
return;
}
for(node *it = deq.p; it != NULL; it = it->next)
if(it->val == x) {
if(it->next != NULL)
(it->next)->prev = it->prev;
if(it->prev != NULL)
(it->prev)->next = it->next;
it->next = NULL;
it->prev = NULL;
delete it;
return;
}
}
//bool Find(Deque& deq, const int& x)
bool Find(Deque& deq, int& x) {
node *it = deq.p;
while(it != NULL) {
if(it->val == x)
return 1;
it = it->next;
}
return 0;
}
int main() {
ifstream f("hashuri.in");
ofstream g("hashuri.out");
int op, n, x, i;
f>>n;
for(i = 1; i <= n; i++) {
f>>op>>x;
if(op == 1) {
if(Find(H[x % prim], x) == 0)
Insert(H[x % prim], x);
} else
if(op == 2) {
Delete(H[x % prim], x);
} else
g<<Find(H[x % prim], x)<<'\n';
}
return 0;
}