Pagini recente » Cod sursa (job #2848715) | Cod sursa (job #1465113) | Cod sursa (job #385978) | Cod sursa (job #1502449) | Cod sursa (job #919247)
Cod sursa(job #919247)
#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;
}