Pagini recente » Cod sursa (job #34285) | Cod sursa (job #3293802) | Cod sursa (job #1839440) | Cod sursa (job #1813976) | Cod sursa (job #1503507)
/* Tratare coliziuni: h(key, i) = (h'(key) + i) cu i = 0, M */
#include <fstream>
#include <vector>
using namespace std;
const int NMAX = 1000001;
const int M = 1700000;
const int R1 = 356375;
const int R2 = 21312;
int N;
int h[M];
bool viz[M];
bool filled[M];
int getnext(int value, int index) {
return value + R1 * index + R2 * index * index;
}
void adauga(int key) {
int value = key % M;
int i = 1;
while(filled[value]) {
value = getnext(value, i);
i++;
if(value >= M)
value %= M;
}
filled[value] = true;
viz[value] = true;
h[value] = key;
}
void sterge(int key) {
int value = key % M;
for(int i = 1; h[value] != key && viz[value] == true && i < M; ++i) {
value = getnext(value, i);
if(value >= M)
value %= M;
}
if(h[value] == key)
filled[value] = false;
}
int interogare(int key) {
int value = key % M;
for(int i = 1; viz[value] == true && h[value] != key && i < M; ++i) {
value = getnext(value, i);
if(value >= M)
value %= M;
}
if(h[value] == key && filled[value] == true)
return 1;
return 0;
}
int main() {
ifstream fin ("hashuri.in");
ofstream fout ("hashuri.out");
fin >> N;
while(N--) {
int type; int x;
fin >> type >> x;
switch(type) {
case 1: adauga(x); break;
case 2: sterge(x); break;
case 3: fout << interogare(x) << '\n'; break;
}
}
return 0;
}