#include <fstream>
#include <string.h>
#include <vector>
#include<math.h>
#include <cstdlib>
#include <stdlib.h>
#include <time.h>
#include<iostream.h>
using namespace std;
ifstream f("hashuri.in");
ofstream g("hashuri.out");
unsigned int* alocare(unsigned int *hash, int mod)
{
hash = (unsigned int *) malloc (mod * sizeof(unsigned int));
return hash;
}
int inserare(int a, int b, unsigned int *hash, int mod, int val)
{
int nr;
nr = (a+b*val)%mod;
if( (hash[nr] == 0) || (hash[nr] == val) )
{
hash[nr] = val;
return 0;
}
int aux;
aux= hash[nr];
hash[nr]=val;
return aux;
}
bool adaugare(int a, int b, int c, int d, unsigned int *hash1, unsigned int *hash2, int mod1, int mod2, int val)
{
int poz, start=1, aux;
aux = inserare(a, b, hash1, mod1, val);
while(aux!=0)
{
if( aux == val )
return 0;
else
if(start==1)
{
aux = inserare(c, d, hash2, mod2, val);
start= 0;
}
else
{
aux = inserare(a, b, hash1, mod1, val);
start= 1;
}
}
return 1;
}
void stergere(int a, int b, int c, int d, unsigned int *hash1, unsigned int *hash2, int mod1, int mod2, int val)
{
if( ( hash1[(a+b*val)%mod1] == val ) )
hash1[(a+b*val)%mod1]=0;
else
if( hash2[(c+d*val)%mod2] == val )
hash2[(c+d*val)%mod2] = 0;
}
void cautare(int a, int b, int c, int d, unsigned int *hash1, unsigned int *hash2, int mod1, int mod2, int val)
{
int poz;
if( ( hash1[(a+b*val)%mod1] == val ) || ( hash2[(c+d*val)%mod2] == val ) )
g<<1<<"\n";
else
g<<0<<"\n";
}
void rezolvare()
{
unsigned int *hash1, *hash2;
int n, op, val, i, a, b, c, d, mod1, mod2, ok=0, nr1, nr2, size = 1000000;;
int pr[]={666013, 666769, 667519, 668273, 669023, 669787, 670541, 671287, 672041, 672787, 673549, 674299, 675067, 675817, 676573, 677321, 678077, 678823, 679597, 680347};
srand( time( NULL ) );
a = rand()%10000+100;
b = rand()%10000+100;
c = rand()%10000+100;
d = rand()%10000+100;
nr1 = rand()%20;
nr2 = rand()%20;
mod1 = 666013;
srand (time(NULL));
hash1 = alocare(hash1, size);
hash2 = alocare(hash2, size);
memset(hash1,0,1000000);
memset(hash1,0,1000000);
f>>n;
for(i=1; i <= n; i++)
{
f>>op>>val;
if(op==1)
{
/*
while(ok==0)
{
free(hash1);
free(hash2);
a = rand()%10000+100;
b = rand()%10000+100;
c = rand()%10000+100;
d = rand()%10000+100;
nr1 = rand()%20;
nr2 = rand()%20;
mod1 = pr[nr1];
mod1 = pr[nr2];
hash1 = (unsigned int *)malloc(1000000 * sizeof(unsigned int));
hash2 = (unsigned int *)malloc(1000000 * sizeof(unsigned int));
memset(hash1,0,1000000);
memset(hash1,0,1000000);
ok = adaugare(a, b, c, d, hash1, hash2, mod1, mod2, val);
}
*/
ok = adaugare(a, b, c, d, hash1, hash2, mod1, mod2, val);
}
else
if(op==2)
stergere(a, b, c, d, hash1, hash2, mod1, mod2, val);
else
cautare(a, b, c, d, hash1, hash2, mod1, mod2, val);
}
free(hash1);
free(hash2);
}
int main()
{
rezolvare();
return 0;
}