Cod sursa(job #371213)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 4 decembrie 2009 13:14:27
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<stdio.h>
#include<stdlib.h>

#define NN 1000001
#define NM 1000001
struct nod{
	int x;
	nod*next;
	};
struct lista{
	nod*vf,*sf;
	};

int n;
lista v[NM];

void add(lista&l,int x){
nod *nn=(nod*)malloc(sizeof(nod));;
nn->x=x;
nn->next=NULL;
if(!l.vf) l.vf=nn;
else l.sf->next=nn;
l.sf=nn;
}

int cauta(int x){
int r=x%NN;
nod *nc=v[r].vf;
while(nc&&nc->x!=x) nc=nc->next;
return nc!=0;
}

void sterge(int x){
int r=x%NN;
nod *t,*nc=v[r].vf;
if(!nc) return;
if(nc->x==x) {
	if(nc==v[r].sf) v[r].sf=nc->next;
	v[r].vf=nc->next;
	free(nc);;
	return;
	}
while(nc->next&&nc->next->x!=x) nc=nc->next;
if(nc!=v[r].sf){
	t=nc->next;
	nc->next=nc->next->next;
	if(t==v[r].sf) v[r].sf=nc;
	free(t);
	}
}

int main(){
freopen("hashuri.in","r",stdin);
freopen("hashuri.out","w",stdout);
int i,m,op,x;
char s[15],*p;
scanf("%d\n",&m);
while(m--){
	fgets(s,14,stdin);
	p=s;
	op=atoi(p);p+=2;x=atoi(p);
	switch(op){
		case 1:i=cauta(x);
			   if(!i) add(v[x%NN],x);
			   break;
		case 2:sterge(x);break;
		case 3:i=cauta(x);
			   if(i) printf("1\n");
			   else printf("0\n");
		}
	}
return 0;
}