#include<iostream>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
using namespace std;
unsigned int* alocare(unsigned int *hash, int mod)
{
hash = (unsigned int *) malloc (mod * sizeof(unsigned int));
return hash;
}
bool adaugare(int a, int b, int c, int d, unsigned int *hash1, unsigned int *hash2, int mod1, int mod2, unsigned int val)
{
int start=0, nr=0;
unsigned int aux, aux2;
//cout<<"\nvaloare= "<<val<<"\n";
//cout<<"\npozitie= "<<(a+b*val)%mod1<<"\n";
if(hash1[(a+b*val)%mod1]==0)
{
//cout<<"\npozitie= "<<(a+b*val)%mod1<<"\n";
aux = 0;
hash1[(a+b*val)%mod1]=val;
}
else
{
aux=hash2[(c+d*val)%mod2];
hash2[(c+d*val)%mod2]=val;
}
while(aux!=0 && nr<30)
{
aux2=aux;
if(start==0)
{
aux=hash1[(a+b*val)%mod1];
hash1[(a+b*val)%mod1]=aux2;
start=1;
}
else
{
aux=hash2[(c+d*val)%mod2];
hash2[(c+d*val)%mod2]=aux2;
start=0;
}
nr++;
}
if(aux==0)
return 1;
return 0;
}
void stergere(int a, int b, int c, int d, unsigned int *hash1, unsigned int *hash2, int mod1, int mod2, unsigned 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;
}
bool cautare(int a, int b, int c, int d, unsigned int *hash1, unsigned int *hash2, int mod1, int mod2, unsigned int val)
{
if( ( hash1[(a+b*val)%mod1] == val ) || ( hash2[(c+d*val)%mod2] == val ) )
return 1;
else
return 0;
}
void rezolvare()
{
unsigned int *hash1, *hash2, val;
int n, op, i, a, b, c, d, mod1, mod2, ok=0, nr1, nr2, size=1000000;
int pr[]={999983, 999979, 899981, 900007,800011, 678077, 678823, 679597, 680347};
srand( time( NULL ) );
hash1 = alocare(hash1, size);
hash2 = alocare(hash2, size);
while(ok==0)
{
a = rand()%1000000+1;
b = rand()%1000000+1;
c = rand()%1000000+1;
d = rand()%1000000+1;
//cout<<a<<" "<<b<<"\n";
nr1 = rand()%5;
nr2 = rand()%5;
mod1 = pr[nr1];
mod2 = pr[nr2];
mod2 = mod1;
memset(hash1,0,size);
memset(hash2,0,size);
FILE *f = fopen ( "hashuri.in", "r");
FILE *g = fopen ( "hashuri.out", "w");
fscanf (f,"%d", &n);
ok=1;
for(i=1; i <= n && ok; i++)
{
fscanf (f, "%d %d", &op, &val);
//cout<<i<<" "<<op<<" "<<val<<"\n";
if(op==1)
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
fprintf( g,"%d\n", cautare(a, b, c, d, hash1, hash2, mod1, mod2, val));
}
}
free(hash1);
free(hash2);
}
int main()
{
rezolvare();
return 0;
}