Pagini recente » Cod sursa (job #1281335) | Cod sursa (job #409413) | Cod sursa (job #3191329) | Cod sursa (job #1436818) | Cod sursa (job #912305)
Cod sursa(job #912305)
#include<fstream>
#include<time.h>
#include <stdlib.h>
using namespace std;
int a1,a2,*v1,*v2;
void aloca(int n){
v1=(int*)calloc(n+1,sizeof(int));
v2=(int*)calloc(n+1,sizeof(int));
}
int h1(int x,int n){
long long c=a1;
c+=x;
c*=c;
c+=a2;
c%=n;
return c;
}
int h2(int x,int n){
long long c=a2;
c-=x;
c*=c;
c+=a1;
c%=n;
return c;
}
void reset(int n){
a1=rand()%n;
a2=rand()%n;
}
void inserare(int x, int n);
void rehash(int n){
reset(n);
int *v3=v1;
int *v4=v2;
int i;
aloca(n);
for(i=1;i<=n;i++){
if(i[v3]!=0)inserare(i[v3],n);
if(i[v4]!=0)inserare(i[v3],n);
}
free(v3);
free(v4);
}
int cautare(int x,int n){
if(v1[h1(x,n)]==x)return 1;
if(v2[h2(x,n)]==x)return 1;
return 0;
}
void inserare(int x,int n){
if(cautare(x,n)==0){
int ok=0;
if(v1[h1(x,n)]==0){
v1[h1(x,n)]=x;
ok=1;
}
else if(v2[h2(x,n)]==0){
v2[h2(x,n)]=x;
ok=1;
}
int aux,k=0,i=0;
while((ok==0)&&(i<30)){i++;
if(v1[h1(x,n)]==0){
v1[h1(x,n)]=x;
ok=1;
}
else if(v2[h2(x,n)]==0){
v2[h2(x,n)]=x;
ok=1;
}
else{
k++;
if(k%2==1){
aux=v1[h1(x,n)];
v1[h1(x,n)]=x;
x=aux;
}
else{
aux=v2[h2(x,n)];
v2[h2(x,n)]=x;
x=aux;
}
}
if(i==30)rehash(n);
}
}
}
void sterge(int x,int n){
if(v1[h1(x,n)]==x)v1[h1(x,n)]=0;
else if(v2[h2(x,n)]==x)v2[h2(x,n)]=0;
}
main(){
int n,i,op,x;
ifstream f("hashuri.in");
ofstream g("hashuri.out");
f>>n;
aloca(n);
reset(n);
for(i=1;i<=n;i++){
f>>op>>x;
if(op==1)inserare(x,n);
if(op==2){
if(cautare(x,n)==1)
sterge(x,n);
}
if(op==3){
if(cautare(x,n)==1)
g<<1<<"\n";
else g<<0<<"\n";
}
}
}