Cod sursa(job #2894266)

Utilizator AncaGAncuta Gava AncaG Data 27 aprilie 2022 17:35:13
Problema Hashuri Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb

#include <iostream>
#include <fstream>
#include <vector>
#define N 666013

using namespace std;
vector<int> hashul_nebun[N];


inline vector<int>::iterator find_value(int x)
{
    int clasa_find = x % N;
    vector<int>::iterator it;

    for (it = hashul_nebun[clasa_find].begin(); it != hashul_nebun[clasa_find].end(); it++)
// dereferentiez astfel incat sa preiau valoarea de la acea adresa
        if (*it == x)
            return it;
    return hashul_nebun[clasa_find].end();
}


inline void add_value(int x)
{
    int clasa_add = x % N;
    // daca nu gasesc val pana la finald e hash atunci il adaug
    if (find_value(x) == hashul_nebun[clasa_add].end())
        hashul_nebun[clasa_add].push_back(x);
}


inline void delete_value(int x)
{
    int clasa_del = x % N;
    // iteratorul valorii x este preluat si este cautat valoarea
    vector<int>::iterator it = find_value(x);

    // daca este gasita valoarea, deci se ajunge la finalul hashului cu o val existenta  atunci o sterg
    if (it != hashul_nebun[clasa_del].end())
        hashul_nebun[clasa_del].erase(it);  // mergea si cu pop daca il mutam la final cu swap
}


int main()
{
    int n, op, x;

    ifstream input("hashuri.in");
    ofstream output("hashuri.out");
    input >> n;

    for(int i = 1; i <= n; i++)
    {
        input >> op >> x;
        if(op == 1)
        {
            add_value(x);
            continue;
        }
        else if(op == 2)
        {
            delete_value(x);
            continue;
        }
        else if(op == 3)
        {
            int found=0;
            // daca este gasita valoarea atunci imi iau un flag de found pe care il si afisez
            if(find_value(x)!=hashul_nebun[x%N].end())
                found=1;

            output << found<< endl;
        }
    }

    return 0;
}