Cod sursa(job #1584068)

Utilizator iulian_f2kGuraliuc Iulian iulian_f2k Data 29 ianuarie 2016 18:08:02
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <iostream>
#include <fstream>
#define NMAX 1000005
//#define H ((2<<20) -1)
#define H 666013
using namespace std;
struct element
{
    int val;
    element *urm=NULL;
    element *ant=NULL;
}*M[H], *p;
int N, op, elem;

bool cautaInMultime(int elem)
{
    int indice = elem % H;
    p=M[indice];
    while(p)
        if(p->val==elem)
            return 1;
        else
            p=p->urm;
    return 0;
}

void introducere(int elem)
{
    int indice= elem % H;

    if(!cautaInMultime(elem))
    {
        element *q=new element;
        if(M[indice]==NULL)
        {
            q->val=elem;
            M[indice]=q;
        }
        else
        {
            element *aux = M[indice];
            while( aux->urm)
                aux=aux->urm;

            q->ant=aux;
            q->val=elem;
            aux->urm=q;
        }
    }
}

void sterge(int elem)
{
    int indice = elem % H;
    if(M[indice] == NULL)
        return;
    p=M[indice];
    while(p)
    {
        if(p->val==elem)
        {
            if(p->ant){
                p->ant->urm= p->urm;
                if (p->urm)
                    p->urm->ant=p->ant;
            }
            else{
                M[indice]=p->urm;
                if(p->urm)
                    p->urm->ant=NULL;
            }
            delete p;
            break;
        }
        else
            p=p->urm;
    }
}
int main()
{
    freopen("hashuri.in", "rt", stdin);
    freopen("hashuri.out", "wt", stdout);


    scanf("%d", &N);
    for(int i=1; i<=N; i++)
    {
        scanf("%d %d\n", &op, &elem);
        if(op == 1)
            introducere(elem);
        else if(op == 2)
            sterge(elem);
        else
            cout<<cautaInMultime(elem)<<'\n';
    }
}