Cod sursa(job #904554)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 4 martie 2013 16:17:28
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <cstring>
#include <string>


using namespace std;

const int MAXSTEP = 30;
const int prime = 100000009;
const int sz = 1000003;


#define F1 (h(a1, b1, prime, x, sz))
#define F2 (h(a2, b2, prime, x, sz))


int h(int a, int b, int prime, int val, int sz) {
	return ( (1LL * a * val + b) % prime ) % sz;
}

void createFunctions(int &a1, int &a2, int &b1, int &b2) {		
	
	a1 = rand() % prime; 
	a2 = rand() % prime;
	
	b1 = rand() % prime;
       	b2 = rand() % prime;

}
void createTable(int *&h1, int *&h2, int *&v1, int *&v2, int n) {
	h1 = new int[n];
	h2 = new int[n];
	v1 = new int[n];
	v2 = new int[n];

	memset(v1, 0, sizeof(v1));
	memset(v2, 0, sizeof(v2));


}
void insert( int *&h1, int *&h2, int *&v1, int *&v2, 
		int a1, int b1, int a2, int b2, int x) {
	
	int steps = 0;
	while(steps < MAXSTEP) {
		int y;
		steps += 2;
				
		if( v1[F1] == 0) {
			h1[F1] = x ; 
			v1[F1] = 1;
			return ;

		}

		y = h1[F1] ; 
		h1[F1] = x;
		
		if(v2[F2] == 0) {
			h2[F2] = y;
			v2[F2] = 1;
			return ;
		}

		x = h2[F2] ; 
		h2[F2] = y ;

	}
}

bool find( int *&h1, int *&h2, int *&v1, int *&v2,
		int a1, int b1, int a2, int b2, int x) {

	return (  (v1[F1] == 1 && h1[F1] == x) || (v2[F2] == 1 && h2[F2] == x) ) ;
}
void sterge( int *&h1, int *&h2, int *&v1, int *&v2,
		int a1, int b1, int a2, int b2, int x) {
	if( h1[F1] == x && v1[F1] == 1) {
		h1[F1] = 0;
		v1[F1] = 0;
	}
	if(h2[F2] == x && v2[F2] == 1) {
		h2[F2] = 0;
		v2[F2] = 0;
	}
}
int main() {
	
	freopen("hashuri.in", "r", stdin);
	freopen("hashuri.out", "w", stdout);
	
	srand(time(NULL));

	int a1, b1, a2, b2;
	int *h1, *h2, *v1, *v2;

	int Q, op, x;

	createFunctions(a1, a2, b1, b2);
	createTable(h1, h2, v1, v2, sz);
//	cout << a1 << " " << a2 << " " << b1 << " " << b2 << "\n";
	for( cin >> Q; Q--; ) {
		cin >> op >> x;
		if(op == 1) {
			insert(h1, h2, v1, v2, a1, b1, a2, b2, x);
		}
		if(op == 2) {
			if( int(find(h1, h2, v1, v2, 
					a1, b1, a2, b2, x))) {
				sterge(h1, h2, v1, v2,
					a1, b1, a2, b2, x);
			}
		}
		if(op == 3) {
			cout << int(find(h1, h2, v1, v2, a1, b1, a2, b2, x)) << "\n";
		}
		
	}
	return 0;
}