#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
using namespace std;
unsigned int* aloca(unsigned int *h, int MOD)
{
h = (unsigned int *) malloc (MOD * sizeof(unsigned int));
return h;
}
void SetHash (int &a, int &b, int &c, int &MOD)
{
int mo[]={999983,999979,899981,900007,800011};
a = rand () % 10000000 + 1;
b = rand () % 20008900 + 1;
c = rand () % 10080000 + 1;
MOD = mo[rand () % 5];
}
int insereaza (unsigned int x, int a, int b, int c, unsigned int *h1, unsigned int *h2, int MOD)
{
int ok = 0, st = 1, v1, v2;
unsigned int aux;
v1 = (a * x + b) % MOD;
v2 = (b * x + c*c) % MOD;
while( ok > -30 )
{
if( st == 1 )
{
if(!h1 [v1] || h1 [v1] == x)
{
h1 [v1] = x;
return 1;
}
else
{
st = -1;
if( ok < 0)
{
aux = x;
x = h1 [v1];
h1 [v1] = aux;
v1 = (a * x + b) % MOD;
v2 = (b * x + c*c) % MOD;
}
}
}
if( st == -1)
{
if(!h2 [v2] || h2 [v2] == x)
{
h2 [v2] = x;
return 1;
}
else
{
st = 1;
if( ok < 0)
{
aux = h2[v2];
h2[v2] = x;
x = aux;
v1 = (a * x + b) % MOD;
v2 = (b * x + c*c) % MOD;
}
}
}
ok--;
}
return 0;
}
void del(unsigned int x, int a, int b, int c, unsigned int *h1, unsigned int *h2, int MOD)
{
int v1,v2;
v1 = (a * x + b) % MOD;
v2 = (b * x + c*c) % MOD;
if(h1[v1] == x) h1[v1] = 0;
else if(h2[v2] == x ) h2[v2] = 0;
}
int cauta(unsigned int x, int a, int b, int c, unsigned int *h1, unsigned int *h2, int MOD)
{
int v1 = (a * x + b) % MOD;
int v2 = (b * x + c*c) % MOD;
if(h1 [v1] == x) return 1;
if(h2 [v2] == x ) return 1;
return 0;
}
void citeste (int a, int b, int c, unsigned int *h1, unsigned int *h2, int MOD)
{
int n, caz, i;
unsigned int x;
int ok = 0;
while (ok == 0)
{
ok = 1;
FILE *f = fopen ("hashuri.in", "r");
FILE *fi = fopen ( "hashuri.out", "w");
fscanf (f,"%d", &n);
SetHash (a, b, c, MOD);
memset(h1,0,1000000);
memset(h2,0,1000000);
for (i = 1; i <= n && ok; i++)
{
fscanf (f, "%d %d", &caz, &x);
switch (caz)
{
case 1: if(!insereaza( x, a, b, c, h1, h2, MOD))
{
ok = 0;
}
break;
case 2: del(x, a, b, c, h1, h2, MOD); break;
case 3: fprintf( fi,"%d\n", cauta(x, a, b, c, h1, h2, MOD)); break;
}
}
fclose(f);
fclose(fi);
}
}
int main()
{
int a, b, c, MOD;
unsigned int *h1, *h2;
srand (time(NULL));
h1 = aloca(h1, 1000000);
h2 = aloca(h2, 1000000);
citeste (a, b, c, h1, h2, MOD);
free(h1);
free(h2);
return 0;
}