Cod sursa(job #1994864)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 26 iunie 2017 13:35:01
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
using namespace std;

#define MAX 104729  

struct Node {
	int value;
	Node* next;
	Node(int _value, Node* _next = NULL) : value{ _value }, next{ _next }
	{
	}
};

class Set {
public:
	Set() : m(MAX)
	{
		for (int i = 0; i < m; ++i)
			t[i] = NULL;
	}
	int d(int i)
	{
		return i % m;
	}
	void add_value(int value)
	{
		if (find_value(value))
			return;
		int poz = d(value);
		Node* node = new Node(value, t[poz]);
		t[poz] = node;
	}
	void delete_value(int value)
	{
		int poz = d(value);
		Node* node = t[poz];
		if (node != NULL && node->value == value)
		{
			t[poz] = node->next;
			delete node;
			return;
		}

		while (node != NULL)
		{
			if (node->next != NULL && node->next->value == value)
			{
				Node* aux = node->next;
				node->next = node->next->next;
				delete aux;
				return;
			}
			node = node->next;
		}
	}
	bool find_value(int value)
	{
		int poz = d(value);
		Node* node = t[poz];
		while (node != NULL)
		{
			if (node->value == value)
				return true;
			node = node->next;
		}
		return false;
	}
private:
	int m;
	Node* t[MAX];
};

int main()
{
	int op, type, x;
	Set s;

	ifstream is("hashuri.in");
	ofstream os("hashuri.out");

	is >> op;
	while (op--)
	{
		is >> type >> x;
		switch (type)
		{
		case 1:
			s.add_value(x);
			break;
		case 2:
			s.delete_value(x);
			break;
		default:
			os << s.find_value(x) << "\n";
			break;
		}
	}

	is.close();
	os.close();
	return 0;
}