Cod sursa(job #1535672)

Utilizator ionutmodoModoranu Ionut-Vlad ionutmodo Data 25 noiembrie 2015 00:33:07
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
/*
	http://www.infoarena.ro/problema/hashuri
*/

#define INPUT "hashuri.in"
#define OUTPUT "hashuri.out"
#define MAX 1000001
#define MOD 666013

#include <fstream>
#include <iostream>
#include <map>
using namespace std;

struct Node
{
	int info;
	Node *next;
	Node(int data) : info(data), next(nullptr) { }
	Node(int data, Node *link) : info(data), next(link) { }
};

int N;
Node *H[MOD];

int Hash(int key)
{
	return (key % MOD);
}

bool exists(int key)
{
	int code = Hash(key);
	for (Node *p = H[code]; p; p = p->next)
	{
		if (p->info == key)
		{
			return true;
		}
	}
	return false;
}

void add(int key)
{
	if (!exists(key))
	{
		int code = Hash(key);
		if (H[code] == nullptr)
		{
			H[code] = new Node(key);
		}
		else
		{
			Node *p = new Node(key, H[code]);
			H[code] = p;
		}
	}
}

void remove(int key)
{
	if (exists(key))
	{
		int code = Hash(key);
		if (H[code]->info == key)
		{
			Node *p = H[code];
			H[code] = H[code]->next;
			delete p;
		}
		else
		{
			Node *p;
			for (p = H[code]; p && p->next->info != key; p = p->next);
			if (p)
			{
				Node *q = p->next;
				p->next = q->next;
				delete q;
			}
		}
	}
}

int main()
{
	int i, op, x;
	ofstream fout(OUTPUT);
	ifstream fin(INPUT);
	fin >> N;
	for (i = 0; i < N; ++i)
	{
		fin >> op >> x;
		switch (op)
		{
		case 1:
			add(x);
			break;
		case 2:
			remove(x);
			break;
		case 3:
			fout << exists(x) << "\n";
			break;
		}
	}
	fin.close();
	fout.close();

	for (Node *p = H[1]; p; p = p->next)
	{
		cout << p->info << " ";
	}
	return 0;
}