Cod sursa(job #1839112)

Utilizator andreiugravuFMI Andrei Zugravu andreiugravu Data 2 ianuarie 2017 14:29:27
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
//Hashuri

#include <fstream>
#include <vector>

using namespace std;

ifstream fin("hashuri.in");
ofstream fout("hashuri.out");

#define MOD 666013

struct node {
    int key;
    node *next;
};

typedef struct node* List;

vector <List> Map;
int N;

int f(int x) {
    return x%MOD;
}

void Insert(int x) {
    int val = f(x); //aplic functia de dispersie
    List p = new node; //nod nou
    p->key = x; //introduc elementul in lista corespunzatoare
    p->next = Map[val];
    Map[val] = p;
}

void Erase(int x) {
    int val = f(x);
    List p = Map[val]; //lista corespunzatoare
    if(p == NULL)
        return; //nu am ce sa sterg

    if(p->key == x) { //l-am gasit
        Map[val] = p->next;
        delete p; //l-am sters
    }
    else { //il caut in lista
        List q = p->next;
        while(q != NULL && q->key != x) {
            q = q->next;
            p = p->next; //ma mut la dreapta
        }
        if(q != NULL) {
            p->next = q->next;
            delete q; //sterg
        }
    }
}

int Search(int x) {
    int val = f(x);
    List p = Map[val];
    while(p != NULL && p->key != x) {
        p = p->next;
    }

    if(p != NULL) //am gasit
        return 1;
    return 0; //nu am gasit
}

int main()
{
    int op, x;

    fin>>N;
    Map.resize(MOD);
    for(int i = 1 ; i <= N ; i++) {
        fin>>op>>x;

        switch(op) {
            case 1 : Insert(x); break; //inserare
            case 2 : Erase(x); break; //stergere
            case 3 : fout<<Search(x)<<"\n"; break;
            default : break;
        }
    }
    fin.close();
    fout.close();

    return 0;
}