Pagini recente » Cod sursa (job #1681928) | Cod sursa (job #2063774) | Cod sursa (job #469743) | Cod sursa (job #576424) | Cod sursa (job #1765728)
#include <stdio.h>
#include <stdlib.h>
#define MOD 798496
#define h(x) (x%MOD)
int val[1000001], next[1000001], lista[MOD];
inline void insert(int p, int x){
val[p]=x;///marcam in vectorul de valori ca pe pozitia p se afla x
next[p]=lista[h(x)];///vom avea o lista simplu inlantuita in care pe pozitia p
///vom retine care era ultima valoarea aflata in vectorul lista pe poztia pe h(x)
///ca apoi sa inseram in lista[h(x)] alta valoarea
lista[h(x)]=p;///pe valori de la 0 la mod-1 noi cand apelam h(x) va returna o valore y,
///noi vom retine in vectorul lista care este pozitia ultimul element care prelucrat prin hash
///a avut valoarea y, deci mai precis lista[y]=pozitia ultimului element care a returnat prin hash y
}
inline int cauta(int x){
int poz;
poz=lista[h(x)];///poz=valoarea indicelui ultimului element care a avut aceeasi cheie hash ca si x
while(poz && val[poz]!=x)///cat timp nu nimerim cu indicele pe 0 (indexam de la 1), si valoarea actuala nu e x
poz=next[poz];///ne ducem la urmatorul indice care a avut o valoare cu acelasi cheie hash ca si x
return (poz>0);
}
inline void sterge(int x){
int poz=lista[h(x)];
if(val[poz]==x){
lista[h(x)]=next[poz];
}
else{
while(next[poz] && val[next[poz]]!=x)///cat timp nu urmeaza 0 si valoarea a ce urmeaza nu e x
poz=next[poz];///ne ducem la urmatorul indice cu aceeasi cheie hash ca si x
if(val[next[poz]]==x){///daca valoarea a ce urmeaza este x
next[poz]=next[next[poz]];///atunci stergem aceasta valoarea ducandu-ne la urmatoarea din lista inlantuita
}
}
}
int main(){
int n, i, t, x;
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", &t, &x);
if(t==1){
if(cauta(x)==0)
insert(i, x);
}
else if(t==2){
sterge(x);
}
else fprintf(fout, "%d\n", cauta(x));
}
fclose(fin);
fclose(fout);
return 0;
}