Cod sursa(job #335932)

Utilizator prdianaProdan Diana prdiana Data 31 iulie 2009 10:26:01
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <stdio.h>

#define mod 58967

struct lista
{
	lista *nxt;
	lista *prev;
	int val;
};



lista *h[mod];
lista *p[mod];
lista *aux;

void add(int nr)
{
	int key = nr % mod;
	if (h[key] == 0)
	{
		h[key] = new lista;
		h[key]->val = nr;
		h[key]->prev = 0;
		h[key]->nxt = 0;
		p[key] = h[key];
	}
	else
	{
		while (h[key]!=0)
		{
			if (h[key]->val == nr)
			{
				h[key] = p[key];
				return;
			}
			aux = h[key];
			h[key] = h[key]->nxt;
		}
		h[key] = new lista;
		h[key]->prev = aux;
		h[key]->nxt = 0;
		h[key] = p[key];
	}
}

void find(int nr)
{
	int key = nr % mod;
	while (h[key] !=0)
	{
		if (h[key]->val == nr)
		{
			printf("1\n");
			h[key] = p[key];
			return;
		}
	}
	h[key] = p[key];
	printf("0\n");
}

void del(int nr)
{
	int key = nr % mod;
	while (h[key] !=0)
	{
		if (h[key]->val == nr)
		{
			if (h[key]->nxt == 0 && h[key]->prev == 0)
			{
				delete h[key];
				h[key] = 0;
				p[key] = 0;
				return;
			}
			if (h[key]->prev == 0)
			{
				p[key] = h[key]->nxt;
				h[key]->nxt->prev = 0;
				delete h[key];
				h[key] = 0;
				h[key] = p[key];
				return;
			}
			if (h[key]->nxt == 0)
			{
				h[key]->prev->nxt = 0;
				delete h[key];
				h[key] = 0;
				h[key] = p[key];
				return;
			}
			h[key]->prev->nxt = h[key]->nxt;
			h[key]->nxt->prev = h[key]->prev;
			delete h[key];
			h[key] = p[key];
			return;
		}
	}
}

int main()
{
	freopen("hashuri.in","r",stdin);
	freopen("hashuri.out","w",stdout);
	
	int n,op,i,p;
	scanf("%d",&n);
	for (i=0;i<n;i++)
	{
		scanf("%d %d",&op,&p);
		switch (op)
		{
		case 1:
			add(p);
			break;
		case 2:
			del(p);
			break;
		case 3:
			find(p);
			break;

		}
	}

	return 0;
}