Cod sursa(job #32035)

Utilizator eferLiviu Ciortea efer Data 17 martie 2007 11:20:29
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.67 kb
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <list>
#include <queue>
#include <utility>
#include <string>
using namespace std;

#define REP(i, N) for (int i = 0; i < (N); ++i)
#define REPV(i, a, b) for (int i = (a); i <= (b); ++i)
#define REPD(i, N) for (int i = (N)-1; i >= 0; --i)
#define REPVD(i, b, a) for (int i = (b); i >= (a); --i)
#define REPIT(it, v) for (it = (v).begin(); it != (v).end(); ++it)
#define SZ(a) ((int)(a).size())
#define MP make_pair
#define PB push_back
#define X first
#define Y second
#define ALL(a) (a).begin(), (a).end()
#define CLR(a) memset((a), 0, sizeof(a))
#define MSET(a, v) memset((a), v, sizeof(a))
#define CPY(dest, source) memcpy(dest, source, sizeof(dest))

typedef long long LL;
typedef vector<int> VI;
typedef vector<string> VS;
typedef pair<int, int> PII;
typedef set<int> SI;
typedef map<int, int> MII;
typedef deque<int> QI;
typedef deque<PII> QPII;

int main() {
	SI vals;
	map<int, int> difs;

	freopen("zeap.in", "rt", stdin);
	freopen("zeap.out", "wt", stdout);

	while (!feof(stdin)) {
		char buff[16];
		*buff = 0;
		gets(buff);
		if (!strlen(buff)) continue;
		if (buff[0] == 'M') {
			if (SZ(vals) < 2) {
				printf("-1\n");
				continue;
			}
			if (buff[1] == 'A') {
				SI::iterator it = vals.begin();
				SI::iterator itt = vals.end(); --itt;
				printf("%d\n", *itt - *it);
			} else {
				map<int, int>::iterator it = difs.begin();
				printf("%d\n", it->X);
			}
			continue;
		}

		int n;
		sscanf(buff + 2, "%d", &n);
		SI::iterator it = vals.lower_bound(n);
		if (buff[0] == 'I') {
			if (SZ(vals)) {
				if (it == vals.end()) {
					SI::iterator itt = vals.end(); --itt;
					difs[n - *itt]++;
				} else {
					int d = *it - n;
					if (d) {
						difs[d]++;
						if (it != vals.begin()) {
							--it;
							difs[n - *it]++;
							d += n - *it;
							int& m = difs[d];
							if (--m == 0) difs.erase(d);
						}
					}
				}
			}
			vals.insert(n);
		} else if (buff[0] == 'S') {
			if (it == vals.end() || *it != n) printf("-1\n");
			else {
				SI::iterator itt = it; ++itt;

				if (it != vals.begin()) {
					--it;
					int& m = difs[n - *it];
					if (--m == 0) difs.erase(n - *it);
					if (itt != vals.end()) difs[*itt - *it]++;
				}
				if (itt != vals.end()) {
					int& m = difs[*itt - n];
					if (--m == 0) difs.erase(*itt - n);
				}
				vals.erase(n);
			}
		} else if (buff[0] == 'C') {
			if (it == vals.end() || *it != n) printf("0\n");
			else printf("1\n");
		}
	}

	return 0;
}