Pagini recente » Cod sursa (job #1517566) | Cod sursa (job #2021686) | Cod sursa (job #2080895) | Cod sursa (job #2969277) | Cod sursa (job #907872)
Cod sursa(job #907872)
#include <fstream>
#include <time.h>
#include <stdlib.h>
#define RM 79
#define C1 880123
#define C2 432157
#define T1 120053
#define T2 300357
#define SZ 1100000
using namespace std;
ifstream in("hashuri.in");
ofstream out("hashuri.out");
int Disp1, Disp2;
inline void Generate()
{
Disp1 = C1 + rand()%T1;
Disp2 = C2 + rand()%T2;
}
inline int F1(int nr)
{
return nr%Disp1;
}
inline int F2(int nr)
{
return nr%Disp2;
}
inline bool adauga(int nr, int *Hash1, int *Hash2)
{
int i,aux;
for(i=1;i<=RM;i++)
{
if(Hash1[F1(nr)] == 0)
{
Hash1[F1(nr)] = nr;
return 1;
}
else if(Hash2[F2(nr)] ==0)
{
Hash2[F2(nr)] = nr;
return 1;
}
else
{
aux = Hash2[F2(nr)];
Hash2[F2(nr)] = nr;
nr = aux;
}
}
}
inline bool sterge(int nr, int *Hash1, int *Hash2)
{
int v1 = F1(nr), v2 = F2(nr);
if(Hash1[v1] == nr)
{
Hash1[v1] = 0;
return 1;
}
if(Hash2[v2] == nr)
{
Hash2[v2] = 0;
return 1;
}
return 0;
}
inline bool exista(int nr, int *Hash1, int *Hash2)
{
int v1 = F1(nr), v2 = F2(nr);
if(Hash1[v1] == nr || Hash2[v2] == nr)
return 1;
return 0;
}
void Rehash(int K,bool *Op,int *NR,int *Hash1, int *Hash2)
{
delete Hash1;
delete Hash2;
Generate();
Hash1 = new int[Disp1+4];
Hash2 = new int[Disp2+4];
for(int i=1;i<=K;i++)
{
if(Op[i])
if(!adauga(NR[i],Hash1,Hash2))
Rehash(K,Op,NR,Hash1,Hash2);
else sterge(NR[i],Hash1,Hash2);
}
}
int main()
{
int N,op,x;
in>>N;
srand(time(NULL));
Generate();
int *Hash1 = new int[Disp1+4];
int *Hash2 = new int[Disp2+4];
bool Op[N];int NR[N], K=0;
while(N--)
{
in>>op>>x;
if(op==1)
{
Op[++K] = 1,NR[K] = x;
if(!exista(x,Hash1,Hash2))
if(!adauga(x,Hash1,Hash2))
Rehash(K,Op,NR,Hash1,Hash2);
}
if(op==2)
Op[++K] = 0,NR[K] = x,sterge(x,Hash1,Hash2);
if(op==3)
if(exista(x,Hash1,Hash2))
out<<"1\n";
else out<<"0\n";
}
return 0;
}