Cod sursa(job #1503507)

Utilizator TeodorCotetCotet Teodor TeodorCotet Data 16 octombrie 2015 13:16:48
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
/* 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;
}