#include <fstream>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <cctype>
using namespace std;
struct treap {
int vl, pr;
treap *l, *r;
treap (int vl = 0, int pr = 0, treap *l = NULL, treap *r = NULL): vl(vl), pr(pr), l(l), r(r) {}
} *root, *nil;
void split (treap *t, int vl, treap* &l, treap* &r) {
if (t == nil) {
l = r = t;
return ;
}
if (vl < t -> vl) {
split(t -> l, vl, l, t -> l);
r = t;
}
else {
split(t -> r, vl, t -> r, 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 -> pr < r -> pr) {
merge(r -> l, l, r -> l);
t = r;
}
else {
merge(l -> r, l -> r, r);
t = l;
}
}
void ins (treap* &t, int vl, int pr) {
if (pr > t -> pr) {
treap *aux = new treap(vl, pr, nil, nil);
split(t, vl, aux -> l, aux -> r);
t = aux;
return ;
}
if (vl < t -> vl)
ins(t -> l, vl, pr);
else
ins(t -> r, vl, pr);
}
bool count (treap *t, int vl) {
if (t == nil)
return false;
if (t -> vl == vl)
return true;
else if (vl < t -> vl)
return count(t -> l, vl);
else
return count(t -> r, vl);
}
void del (treap* &t, int vl) {
if (t == nil)
return ;
if (t -> vl == vl) {
treap *aux = t;
merge(t, t -> l, t -> r);
delete aux;
}
else if (vl < t -> vl)
del(t -> l, vl);
else
del(t -> r, vl);
}
char sir[15005005];
int lung, poz;
ifstream cin("hashuri.in");
inline void cit () {
cin.get(sir + 1, 15005005, '#');
lung = strlen(sir + 1);
poz = 1;
}
inline void extr (int &res) {
while (poz <= lung && !isdigit(sir[poz]))
poz ++;
res = 0;
while (poz <= lung && isdigit(sir[poz])) {
res *= 10;
res += (sir[poz] - '0');
poz ++;
}
}
int main()
{
ofstream cout("hashuri.out");
srand(time(0));
nil = new treap(-1, -1);
root = nil -> l = nil -> r = nil;
int n = 0;
cin >> n;
cin.get();
cit();
int tip, x;
while (n--) {
//cin >> tip >> x;
extr(tip);
extr(x);
if (tip == 1)
ins(root, x, rand());
else if (tip == 2)
del(root, x);
else
cout << count(root, x) << '\n';
}
cin.close();
cout.close();
return 0;
}