Cod sursa(job #336253)

Utilizator prdianaProdan Diana prdiana Data 31 iulie 2009 12:19:02
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include <stdio.h>
#include <vector>
#define mod 10

using namespace std;

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

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

bool find(int nr)
{
	int key = nr % mod;
	while (a[key] != 0)
	{
		if (a[key]->val == nr)
		{
			a[key] = p[key];
			return true;
		}
		a[key] = a[key]->nxt;
	}
	a[key] = p[key];
	return false;
}

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

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

int main()
{
	freopen("hashuri.in","r",stdin);
	freopen("hashuri.out","w",stdout);
	int n,s,op,i;
	scanf("%d",&n);
	for (i=0;i<n;i++)
	{
		scanf("%d%d",&op,&s);
		{
			switch(op)
			{
			case 1:
				if (!find(s))
				{
					insert(s);
				}
				break;
			case 2:
				if (find(s))
				{
					del(s);
				}
				break;
			case 3:
				if (find(s))
				{
					printf("1\n");
				}
				else
				{
					printf("0\n");
				}
				break;
			}
		}
	}

	return 0;
}