Cod sursa(job #443616)

Utilizator Mishu91Andrei Misarca Mishu91 Data 17 aprilie 2010 18:56:17
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <set>
#include <algorithm>

using namespace std;

#define mp make_pair
#define t first
#define n second
#define common\
		int nst = (nod << 1), ndr = (nst | 1), mij = (li + lf) >> 1

const int MAX_N = 300005;
const int INF = 0x3f3f3f3f;

int N, T, V[MAX_N], A[2*MAX_N], val, poz;
set <int> S;
pair <int, int> Q[MAX_N];

void normalizare() {
	sort(V+1, V+N+1);
	N = unique(V+1, V+N+1)-V-1;
}

void update(int nod, int li, int lf) {
	if(li == lf) {
		A[nod] = val;
		return;
	}

	common;
	if(poz <= mij) update(nst, li, mij);
	else		   update(ndr, mij+1, lf);

	A[nod] = INF;
	A[nod] = min(A[nst], A[ndr]);
}

void insert(int x) {
	if(S.find(x) != S.end()) return;

	set<int>::iterator it1 = S.upper_bound(x);

	if(it1 != S.end()) {
		poz = lower_bound(V+1, V+N+1, *it1) - V;
		val = *it1 - x;
		update(1, 1, N);
	}
	
	if(it1 != S.begin()) {
		poz = lower_bound(V+1, V+N+1, x) - V;
		val = x - *(--it1);	
		update(1, 1, N);
	}

	S.insert(x);
}

void erase(int x) {
	if(S.find(x) == S.end()) {
		printf("-1\n");
		return;
	}

	val = INF;
	poz = lower_bound(V+1, V+N+1, x) - V;
	update(1, 1, N);

	S.erase(x);
	set<int>::iterator it1 = S.upper_bound(x), it2 = it1;
	--it2;

	if(it1 == S.begin()) {
		val = INF;
		poz = lower_bound(V+1, V+N+1, *it1) - V;
		update(1, 1, N);
	}
	
	if(it1 != S.begin() && it1 != S.end()) {
		val = *it1 - *it2;
		poz = lower_bound(V+1, V+N+1, *it1) - V;
		update(1, 1, N);
	}
	
	if(it2 == S.begin()) {
		val = INF;
		poz = lower_bound(V+1, V+N+1, *it2) - V;
		update(1, 1, N);
	}
}

void find(int x) {
	printf("%d\n", (S.find(x) != S.end()));
}

void find_max() {
	if(S.size() < 2)
		printf("-1\n");
	
	else
		printf("%d\n", *S.rbegin() - *S.begin());
}

void find_min() {
	(A[1] == INF)? printf("-1\n"): printf("%d\n", A[1]);
}

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

	char s[10];
	int nr = 0;
	while(scanf("%s", s) != EOF)
		if(s[0] == 'I') {
			scanf("%d", &nr);
			Q[++T] = mp(1, nr);
			V[++N] = nr;
		}
		else if(s[0] == 'S') {
			scanf("%d", &nr);
			Q[++T] = mp(2, nr);
		}
		else if(s[0] == 'C') {
			scanf("%d", &nr);
			Q[++T] = mp(3, nr);
		}
		else if(s[0] == 'M' && s[1] == 'A')
			Q[++T] = mp(4, 0);
		else
			Q[++T] = mp(5, 0);

	normalizare();
	memset(A, INF, sizeof A);
	for(int i = 1; i <= T; ++i)
		if(Q[i].t == 1)
			insert(Q[i].n);
		else if(Q[i].t == 2)
			erase(Q[i].n);
		else if(Q[i].t == 3)
			find(Q[i].n);
		else if(Q[i].t == 4)
			find_max();
		else
			find_min();
}