Cod sursa(job #137)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 5 decembrie 2006 15:15:30
Problema Zeap Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <cstdio>
#include <set>

using namespace std;

const int BMAX = 16;

multiset <int> S, Min;

inline int ABS(int x) { return x < 0 ? -x : x; }

inline int toint(char s[]) {
	int rez = 0, i;
	for (i = 0; isdigit(s[i]); ++i)
		rez = rez * 10 + s[i] - '0';
	return rez;
}

inline void sterg(multiset <int> :: iterator it) {
	int a, b;
	a = *it;
	if (++it != S.end()) {
		b = *it;
		Min.erase( Min.find( ABS(a - b) ) );
	}
}

inline void leaga(multiset <int> :: iterator it) {
	int a, b;
	a = *it;
	if (++it != S.end()) {
		b = *it;
		Min.insert( ABS(a - b) );
	}
}

int main() {
	FILE *fin = fopen("zeap.in", "rt");
	FILE *fout = fopen("zeap.out", "wt");
	char buf[BMAX];
	multiset <int> :: iterator it;
	int aux;
	
	while (fgets(buf, BMAX, fin))
		switch (buf[0]) {
			case 'I':
				aux = toint(buf + 2);
				if (S.find(aux) == S.end()) {
					it = S.lower_bound(aux);
					if (it != S.end() && it != S.begin()) 
						sterg(--it);
					
					it = S.insert(aux);

					leaga(it);
					if (it != S.begin()) 
						leaga(--it);
				}
				break;
			case 'S':
				aux = toint(buf + 2);
				if ((it = S.find(aux)) != S.end()) {
					sterg(it);
					if (it != S.begin())
						sterg(--it),
						++it;
					S.erase(it);

					if (S.size() >= 2) {
						it = S.lower_bound(aux);
						if (it != S.begin())
							leaga(--it);
					}
				} else
					fprintf(fout, "-1\n");
				break;
			case 'C':
				aux = toint(buf + 2);
				if (S.find(aux) != S.end())
					fprintf(fout, "1\n");
				else
					fprintf(fout, "0\n");
				break;
			case 'M':
				if (S.size() < 2)
					fprintf(fout, "-1\n");
				else if (buf[1] == 'A')
					fprintf(fout, "%d\n", *S.rbegin() - *S.begin());
				else
					fprintf(fout, "%d\n", *Min.begin());
				break;
		}

	fclose(fin);
	fclose(fout);
	return 0;
}