Cod sursa(job #836670)

Utilizator alexandru93moraru alexandru sebastian alexandru93 Data 16 decembrie 2012 14:21:00
Problema Hashuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<fstream>
#define nmax 1000000
using namespace std;

bool M[nmax];
unsigned long N;

struct nod{
	unsigned long info;
	nod *next;
};

struct lista{
	nod *p,*u;
};
lista H[nmax];

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

void insL1(unsigned long x){
	unsigned long poz=x%N;
	H[poz].p=new nod;
	H[poz].p->info=x;
	H[poz].p->next=NULL;
	H[poz].u=H[poz].p;
}

void insL2(unsigned long x){
	unsigned long poz=x%N;
	nod *q=new nod;
	q->info=x;
	H[poz].u->next=q;
	q->next=NULL;
	H[poz].u=q;
	
}

void ins(unsigned long x){
	unsigned long poz=x%N;
	if(M[poz]==false){
		M[poz]=true;
		insL1(x);
	}
	else
		insL2(x);
}

void del1(unsigned long x){
	unsigned long poz=x%N;
	nod *q=H[poz].p;
	if(q->info==x){
		if(q->next==NULL){
		delete q;
		M[poz]=false;
		}
		else{
			H[poz].p=H[poz].p->next;
			delete q;
		}
	}
	else
		while(q->next!=NULL)
			if(q->next->info==x){
				nod *z=q->next;
				q->next=q->next->next;
				delete z;
			}
			else
				q=q->next;
}

void del(unsigned long x){
	unsigned long poz=x%N;
	if(M[poz]!=false){
		del1(x);
	}
}

void search(unsigned long x){
	unsigned long poz=x%N;
	if(M[poz]==false)
		g<<0<<'\n';
	else{
		int ok=0;
		nod *q=H[poz].p;
		while(q!=NULL){
			if(q->info==x){
				g<<1<<'\n';
				ok=1;
				break;
			}
			else
				q=q->next;
		}
		if(ok==0) g<<0<<'\n';
	}
}

void citire(){
	unsigned long op,x;
	f>>N;
	for(unsigned long i=1;i<=N;i++){
		f>>op>>x;
		if(op==1)
			ins(x);
		else
			if(op==2)
				del(x);
			else
				search(x);
	}
}

int main(){
	citire();
}