Cod sursa(job #730333)

Utilizator andreipasalauPasalau Andrei andreipasalau Data 6 aprilie 2012 08:54:48
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
#include <iostream>
using namespace std;

ifstream f("hashuri.in");
ofstream g("hashuri.out");


struct lista{
	int numar;
	lista* next;
};

lista *prim[199993];

void adauga(long x){
	int i = x%199993;
	if (prim[i] == NULL){
		prim[i] = new lista;
		prim[i]->numar = x;
		prim[i]->next = NULL;
	}
	else{
		lista *l;
		l = new lista;
		l->next = prim[i];
		l->numar = x;
		prim[i] = l;
	}
}

void sterge(long x){
	int i = x%199993;
	if(prim[i]!=NULL){
		if(prim[i]->numar==x){
			if(prim[i]->next!=NULL){
				lista *p=prim[i];
				prim[i]=prim[i]->next;
				delete p;
				return;
			}
			else{
				delete prim[i];
				prim[i] = NULL;
				return;
			}

		}
		else
			if(prim[i]->next!=NULL){
				lista* n = prim[i];
				while(n->next!=NULL){//merge pana la penultimul
					if(n->next->numar == x){//am gasit numarul
						lista* p = n->next;
						n->next=n->next->next;
						delete p;
						return;
					}
					if(n->next->next==NULL){//x - penultimul element
						if(n->next->numar == x){
							delete n->next;
							n->next=NULL;
						}
					}
					n=n->next;
				}
			}
	}
}

int returneaza(long x){
	int i = x%199993;
	if (prim[i] == NULL)
		return 0;
	else{
		lista *l;
		l = prim[i];
		if(prim[i]->numar == x){
			return 1;
		}
		while(l->next != NULL){
			if (l->numar == x)
				return 1;
			else
				l = l->next;
		}
		if(l->numar == x)
			return 1;
	return 0;
	}
}
int main(){
	int n;
	int op;
	prim[20000] = {NULL};
	long x;
	f >> n;
	for(int i = 0; i < n; i++)
	{
		f >> op;
		f >> x;
		if(op == 1)
			adauga(x);
		else if(op == 2)
			sterge(x);
		else
			g << returneaza(x) << "\n";
	}
	f.close();
	g.close();
	return 0;
}