Cod sursa(job #1956969)

Utilizator PinkiePie1189Preoteasa Mircea-Costin PinkiePie1189 Data 7 aprilie 2017 10:40:09
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<stdio.h>
#define MOD 666013
#define MAXN 1000000
inline int hash(int x);
inline void Add(int x);
inline void Remove(int x);
inline int Query(int x);
FILE*fin,*fout;
int lista[MOD],next[MAXN],val[MAXN];
int FreePtr[MAXN],ult;
int main()
{
	fin=fopen("hashuri.in","r");
	fout=fopen("hashuri.out","w");
	int N;
	fscanf(fin,"%d",&N);
	for(int i=1;i<=N;i++)
	{
		FreePtr[i]=i;
	}
	ult=N;
	for(int i=0;i<N;i++)
	{
		int type,x;
		fscanf(fin,"%d%d",&type,&x);
		if(type==1)
		{
			Add(x);
		}
		if(type==2)
		{
			Remove(x);
		}
		if(type==3)
		{
			fprintf(fout,"%d\n",Query(x));
		}
	}
	fclose(fin);
	fclose(fout);
	return 0;
}
inline int hash(int x)
{
	return x%MOD;
}
inline void Add(int x)
{
	if(!Query(x))
	{
		int p=FreePtr[ult--];
		//printf("%d\n", p);
		next[p]=lista[hash(x)];
		val[p]=x;
		lista[hash(x)]=p;
	}
}
inline void Remove(int x)
{
	int p=lista[hash(x)];
	if(p!=0 && val[p]==x)
	{
		lista[hash(x)]=next[p];
		FreePtr[++ult]=p;
		return;
	}
	while(p!=0 && val[next[p]]!=x)
	{
		p=next[p];
	}
	if(p!=0 && val[next[p]]==x)
	{
		FreePtr[++ult]=next[p];
		next[p]=next[next[p]];
	}
}
inline int Query(int x)
{
	int p=lista[hash(x)];
	if(val[p]==x)
	{
		return 1;
	}
	while(p!=0)
	{
		if(val[next[p]]==x)
		{
			return 1;
		}
		p=next[p];
	}
	return 0;
}