Cod sursa(job #1491680)

Utilizator aimrdlAndrei mrdl aimrdl Data 25 septembrie 2015 20:41:30
Problema Zeap Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <stdio.h>
#include <stdlib.h>
#include <set>
#include <list>

#define HDIM 10000

using namespace std;

set <int> val;
set <int> dif;
list < pair <int, int> > H[HDIM];

//1 - element added
//0 - element already in hash, just increased value
int incr (int x) {
	int pos = x % HDIM;
	list < pair <int, int> >::iterator it;
	
	for (it = H[pos].begin(); it != H[pos].end() && it->first < x; ++it);
	
	if (it->first == x) {
		++it->second;
	} else {
		H[pos].insert(it, make_pair(x, 1));
		return 1;
	}
	
	return 0;
}

//1 - element deleted
//0 - element still in hash
int decr (int x) {
	int pos = x % HDIM;
	list < pair <int, int> >::iterator it;
	
	for (it = H[pos].begin(); it != H[pos].end() && it->first < x; ++it);
	
	if (it->first == x) {
		--it->second;
		if (it->second == 0) {
			H[pos].erase(it);
			return 1;
		}
	}
	
	return 0;
}

//1 - element inserted
//0 - element deleted
int insertVal (int x) {
	auto r = val.insert(x);
	if (r.second == false) return 0;
	
	if (r.first != val.begin()) {
		int d = *r.first - *prev(r.first);
		if (incr(d)) dif.insert(d);
	}
	
	if (next(r.first) != val.end()) {
		int d = *next(r.first) - *r.first;
		if (incr(d)) dif.insert(d);
	}
	
	return 1;
}

//1 - element deleted
//0 - element not found
int deleteVal (int x) {
	auto it = val.find(x);
	if (it != val.end()) {
		if (it != val.begin()) {
			int d = *it - *prev(it);
			if (decr(d)) dif.erase(dif.find(d));
		}
		if (next(it) != val.end()) {
			int d = *next(it) - *it;
			if (decr(d)) dif.erase(dif.find(d));
		}
			
		val.erase(it);
		return 1;
	}
	
	return 0;
}

int minDif () {
	if (dif.empty() == false) {
		return *dif.begin();
	}
	return -1;
}

int maxDif () {
	if (dif.empty() == false) {
		return *dif.rbegin();
	}
	return -1;
}

int main (void) {
	freopen("zeap.in", "r", stdin);
	freopen("zeap.out", "w", stdout);
	
	char buffer[1000];
	while (fgets(buffer, 1000, stdin)) {
		if (buffer[0] == 'I') {
			insertVal(atoi(buffer+2));
		} else if (buffer[0] == 'S') {
			if (deleteVal(atoi(buffer+2)) == 0) printf("-1\n");
		} else if (buffer[0] == 'C') {
			printf("%d\n", (val.find(atoi(buffer+2)) != val.end()) ? 1 : 0);
		} else if (buffer[1] == 'A') {
			printf("%d\n", maxDif());
		} else if (buffer[1] == 'I') {
			printf("%d\n", minDif());
		}
	}
	
	return 0;
}