Pagini recente » Cod sursa (job #623626) | Cod sursa (job #1263012) | Cod sursa (job #42135) | Cod sursa (job #1686555) | Cod sursa (job #1451023)
#include <cstdio>
#include <iostream>
#include <fstream>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <ctype.h>
#include <cstring>
#include <string>
#include <ctime>
#include <cassert>
#include <utility>
using namespace std;
// ideea la hashuri este ca se asociaza fiecarei cheie, o valoarea unica sau cel putin daca nu e injectiva (unu la unu) atunci am un vector de
// MOD elemente in care fiecare e o lista cu elementele care dau x % MOD acel numar
// cand P este destul de mare aproape de N atunci elementele se impart uniform si atunci cand cauti intr-o lista din cele MOD nu cauti mult
// deci obtii rasp la cautare / adaugare / stergere in aproape O(1)
// ca MOD SE ALEGE DE OBICEI UN NUMAR PRIM MARE atat cat iti permite restrictia de memorie sa folosesti.
#define MOD 666013
int x, n, op;
vector<int> hashtable[MOD];
vector<int>::iterator gaseste_pos(int x) {
int m = x % MOD;
for(vector<int>::iterator it = hashtable[m].begin(); it != hashtable[m].end(); it++) {
if(*it == x) {
return it; // returnez pozitia unde am gasit valoarea cautata
}
}
return hashtable[m].end(); // nu am gasit nodul
}
bool exista(int x) {
if(gaseste_pos(x) != hashtable[x % MOD].end()) {
return true;
}
return false;
}
void adauga(int x) {
int m = x % MOD;
if(gaseste_pos(x) == hashtable[m].end()) {
hashtable[m].push_back(x);
}
}
void sterge(int x) {
vector<int>::iterator it = gaseste_pos(x);
int m = x % MOD;
if(it != hashtable[m].end()) { // a fost gasit in hash map
hashtable[m].erase(it);
}
}
int main() {
freopen("hashuri.in", "r", stdin);
freopen("hashuri.out","w", stdout);
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%d %d", &op, &x);
switch(op) {
case 1:
adauga(x);
break;
case 2:
sterge(x);
break;
case 3:
printf("%d\n", exista(x));
break;
}
}
return 0;
}