Pagini recente » Cod sursa (job #1938226) | Cod sursa (job #221046) | Cod sursa (job #1030853) | Cod sursa (job #3132053) | Cod sursa (job #1491680)
#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;
}