Pagini recente » Cod sursa (job #2615068) | Cod sursa (job #377153) | Cod sursa (job #1420195) | Cod sursa (job #1768691) | Cod sursa (job #1763738)
#include <stdio.h>
#define nmax 1000000
#define mod 702113
int val[nmax]; ///val retine valorile date
int next[nmax]; ///next retine elementul anterior ce a avut acelasi hash cu cel actual
int lasthash[mod]; ///pozitia ultimului element ce a avut acel hash
inline void adauga( int poz, int nr ){
val[poz] = nr; ///adaugam elementul in vectorul de valori
next[poz] = lasthash[nr%mod]; ///memoram in lista pozitia ultimului element cu acest cod hash
lasthash[nr%mod] = poz; ///stocam ultima pozitie a nr cu acel hash
}
int cauta( int nr ){
int poz = lasthash[ nr%mod ]; ///luam ultima aparitie a nr cu acel hash
while( poz!=0 && val[poz]!=nr )
poz = next[poz]; ///si mergem pana gasim elementul cautat sau ajungem la sfarsit
return (poz>0); ///daca suntem la sfarsit returnam 0, altfel 1
}
inline void sterge( int nr ){
int poz;
poz = lasthash[nr%mod];
if( val[poz]==nr )
lasthash[nr%mod] = next[poz]; ///daca acest nr este ultimul introdus cu hashuri respectiv
else{
while( val[ next[poz] ]!=nr && next[poz]!=0 ) ///altfel cautam ultima pozitie dinainte aparitie elementului
poz = next[poz];
if( val[ next[poz] ]==nr ) ///daca urmatorul element este cel cautat, il eliminam
next[poz] = next[ next[poz] ];
}
}
int main()
{
int n, i, ver, nr;
FILE *fin, *fout;
fin = fopen( "hashuri.in", "r" );
fout = fopen( "hashuri.out", "w" );
fscanf( fin, "%d", &n );
for( i=1; i<=n; i++ ){
fscanf( fin, "%d%d", &ver, &nr );
if( ver==1 ){
if( cauta(nr)== 0 )
adauga( i, nr );
}
else if( ver==2 ){
sterge(nr);
}
else
fprintf( fout, "%d\n", cauta(nr) );
}
fclose( fin );
fclose( fout );
return 0;
}