#include <fstream>
#include <cstdlib>
#include <ctime>
using namespace std;
struct treap {
int value;
int priority;
treap *left, *right;
treap (int _value = 0, int _priority = 0, treap *_left = NULL, treap *_right = NULL): value(_value), priority(_priority), left(_left), right(_right) {}
} *root, *nil;
void split (treap* t, int value, treap* &l, treap* &r) {
if (t == nil) {
l = r = nil;
return ;
}
if (value <= t -> value) {
split(t -> left, value, t -> left, r);
r = t;
}
else {
split(t -> right, value, t -> right, r);
l = t;
}
}
void merge (treap* &t, treap* l, treap* r) {
if (l == nil) {
t = r;
return ;
}
else if (r == nil) {
t = l;
return ;
}
if (l -> priority < r -> priority) {
merge(r -> right, r -> left, r -> right);
r -> left = l;
t = r;
}
else {
merge(t -> left, l -> left, l -> right);
l -> right = r;
t = l;
}
}
void insert (treap* &t, int value, int priority) {
if (priority > t -> priority) {
treap *l = new treap(value, priority);
split(t, value, l -> left, l -> right);
t = l;
return ;
}
if (value < t -> value)
insert(t -> left, value, priority);
else if (value > t -> value)
insert(t -> right, value, priority);
}
void erase (treap* &t, int value) {
if (t == nil)
return ;
if (t -> value == value) {
treap *aux = t;
merge(t, t -> left, t -> right);
delete aux;
return ;
}
else if (value < t -> value)
erase(t -> left, value);
else
erase(t -> right, value);
}
bool count (treap* &t, int value) {
if (t == nil)
return false;
if (t -> value == value)
return true;
else if (value < t -> value)
return count(t -> left, value);
else
return count(t -> right, value);
}
int main()
{
ifstream cin("hashuri.in");
ofstream cout("hashuri.out");
srand(time(0));
nil = new treap(-1, -1);
nil -> left = nil -> right = nil;
root = nil;
int n = 0;
cin >> n;
int tip, x;
while (n--) {
cin >> tip >> x;
if (tip == 1)
insert(root, x, rand());
else if (tip == 2)
erase(root, x);
else
cout << count(root, x) << '\n';
}
cin.close();
cout.close();
return 0;
}