#include <cstdio>
#include <ctime>
#include <cstdlib>
struct item {
int key, priority;
item* l;
item* r;
item() {
}
item(int _key, int _priority) {
key = _key;
priority = _priority;
l = r = NULL;
}
};
typedef item* pitem;
void split(pitem t, int key, pitem& l, pitem& r) {
if (t == NULL) {
l = r = NULL;
return;
}
if (key < t -> key) {
split(t -> l, key, l, t -> l), r = t;
} else {
split(t -> r, key, t -> r, r), l = t;
}
}
void merge(pitem& t, pitem l, pitem r) {
if (l == NULL || r == NULL) {
t = (l == NULL) ? r : l;
return;
}
if (l -> priority > r -> priority) {
merge(l -> r, l -> r, r);
t = l;
} else {
merge(r -> l, l, r -> l);
t = r;
}
}
void insert(pitem& t, pitem it) {
if (t == NULL) {
t = it;
return;
}
if (it -> priority > t -> priority) {
split(t, it -> key, it -> l, it -> r);
t = it;
} else if (it -> key < t -> key) {
insert(t -> l, it);
} else {
insert(t -> r, it);
}
}
pitem search(pitem t, int key) {
if (t == NULL) {
return NULL;
}
if (t -> key == key) {
return t;
}
if (key < t -> key) {
return search(t -> l, key);
}
return search(t -> r, key);
}
void erase(pitem& t, int key) {
if (t == NULL) {
return;
}
if (t -> key == key) {
merge(t, t -> l, t -> r);
} else if (key < t -> key) {
erase(t -> l, key);
} else {
erase(t -> r, key);
}
}
int main() {
freopen("hashuri.in", "r", stdin);
freopen("hashuri.out", "w", stdout);
srand(time(0));
pitem root = NULL;
int operations, type, no;
scanf("%d", &operations);
for (int operation = 0; operation < operations; operation++) {
scanf("%d%d", &type, &no);
switch(type) {
case 1: {
pitem entry = search(root, no);
if (entry == NULL) {
insert(root, new item(no, rand()));
}
break;
}
case 2: {
erase(root, no);
break;
}
case 3: {
pitem entry = search(root, no);
printf("%d\n", entry == NULL ? 0 : 1);
}
}
}
return 0;
}