Cod sursa(job #919247)

Utilizator b_ady20Branescu Adrian b_ady20 Data 19 martie 2013 15:35:04
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 3.3 kb
#include<fstream>
#include<cstdio>
#define mod 300007
using namespace std;
#ifndef __LIST__H
#define __LIST__H

template <typename T>class Node {
public:
T value;
Node<T> *next;
Node<T> *prev;
Node(){
	next=prev=NULL;
}
~Node(){
}
};

template <typename T>class LinkedList{
private:

Node<T> *pFirst, *pLast;
public:

//Constructor
LinkedList(){
	pFirst=new Node<T>;
	pLast=new Node<T>;
	pFirst=pLast=NULL;
}

//Destructor
~LinkedList(){
	while(!isEmpty())
		removeFirst();
}
	
/*Adauga un nod cu valoarea == value la inceputul listei */
void addFirst(T value){
	Node<T> *p=new Node<T>;
	p->value=value;
	p->next=pFirst;
	if(pFirst!=NULL)
		pFirst->prev=p;
	if(pFirst==NULL) pLast=pFirst=p;
	pFirst=p;
}

/*Adauga un nod cu valoarea == value la sfarsitul listei */
void addLast(T value){
	Node<T> *p=new Node<T>;
	p->value=value;
	p->prev=pLast;
	if(pLast!=NULL)
		pLast->next=p;
	if(pLast==NULL) pFirst=pLast=p;
	pLast=p;
}

/*Elimina elementul de la inceputul listei si intoarce valoarea acestuia*/
T removeFirst(){
	Node<T> *p=new Node<T>;
	T aux;
	aux=pFirst->value;
	p=pFirst->next;
	if(p!=NULL)
		p->prev=NULL;
	pFirst=NULL;
	delete pFirst;
	pFirst=p;
	return aux;
}

/*Elimina elementul de la sfarsitul listei listei si intoarce valoarea acestuia*/
T removeLast(){
	Node<T> *p=new Node<T>;
	T aux;
	aux=pLast->value;
	p=pLast->prev;
	if(p!=NULL)
		p->next=NULL;
	delete pLast;
	pLast=p;
	return aux;
}

/*Elimina prima aparitie a elementului care are valoarea == value*/
T removeFirstOccurrence(T value){
	Node<T> *p=new Node<T>;
	T aux;
	p=findFirstOccurrence(value);
	if(p==NULL) return 0;
	if(p==pFirst) removeFirst();
	else
		if(p==pLast) removeLast();
	else{
		aux=p->value;
		if(p->prev!=NULL)
			p->prev->next=p->next;
		if(p->next!=NULL)
			p->next->prev=p->prev;
		delete p;
	}
	return aux;	
}

/*Elimina ultima aparitie a elementului care are valoarea == value*/
T removeLastOccurrence(T value){
	Node<T> *p=new Node<T>;
	T aux;
	p=findLastOccurrence(value);
	if(p==NULL) return 0;
	if(p==pFirst) removeFirst();
	else
		if(p==pLast) removeLast();
	else{
		aux=p->value;
		if(p->prev!=NULL)
			p->prev->next=p->next;
		if(p->next!=NULL)
			p->next->prev=p->prev;
		delete p;
	}
	return aux;
}

/*Intoarce prima aparitie a elementului care are valoarea == value, NULL daca nu exista*/
Node<T>* findFirstOccurrence(T value){
	Node<T> *p=new Node<T>;
	p=pFirst;
	for(;p;p=p->next)
		if(p->value==value) 
			return p;
	return NULL;
}

/*Intoarce ultima aparitie a elementului care are valoarea == value, NULL daca nu exista*/
Node<T>* findLastOccurrence(T value){
	Node<T> *p=new Node<T>;
	p=pLast;
	for(;p;p=p->prev)
		if(p->value==value) 
			return p;
	return NULL;
}

/*Intoarce 1 daca lista este vida, 0 altfel*/
int isEmpty(){
	return (pFirst==NULL);
}

};
#endif
LinkedList<int>v[mod];
int main(){
    int k,x,n;
    ifstream f;
    f.open("hashuri.in");
    freopen("hashuri.out","w",stdout);
    f>>n; 
    for(int i=1;i<=n;++i){
        f>>k>>x; 
        switch(k){
        case 1: v[x%mod].addLast(x); break;
        case 2: v[x%mod].removeFirstOccurrence(x);break;
		case 3: printf("%d\n",v[x%mod].findFirstOccurrence(x)!=NULL?1:0);break;
        }
    }
    f.close();
    return 0;
}