Cod sursa(job #392674)

Utilizator Mishu91Andrei Misarca Mishu91 Data 8 februarie 2010 00:13:39
Problema Zeap Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.96 kb
#include <cstdio>
#include <set>
#include <ext/hash_map>
#include <map>

using namespace std;
using namespace __gnu_cxx;

#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[5*MAX_N], val, poz;
map <int, int> H;
set <int> S, Sp;
pair <int, int> Q[MAX_N];

void normalizare()
{
	sort(V+1, V+N+1);

	for(int i = 1; i <= N; ++i)
		if(H.find(V[i]) == H.end())
			H[V[i]] = i;
}

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, ndr);

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

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

/*	for(set<int>::iterator it = S.begin(); it != S.end(); ++it)
		fprintf(stderr,"%d ", *it);
	fprintf(stderr, "\n");*/
	//S.insert(x);
	set<int>::iterator it1 = S.upper_bound(x), it2 = Sp.upper_bound(-x);
	//fprintf(stderr, "%d %d\n", *it1, *it2);
	if(it2 != Sp.end())
	{
		poz = H[x];
		val = x + *it2;	
	//	fprintf(stderr, "%d %d %d\n", x, poz, -*it2);
		update(1, 1, N);
	}
	if(it1 != S.end())
	{
		poz = H[*it1];
		val = x - *it1;
		update(1, 1, N);
	}

	S.insert(x);
	Sp.insert(-x);
}

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

	val = INF;
	poz = H[x];
	update(1, 1, N);

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

	if(it1 == S.end())
		if(S.size() == 1)
		{
			val = INF;
			poz = H[-*it2];
			update(1, 1, N);
		}

	if(it2 == Sp.end())
		if(it1 != S.end())
		{
			val = INF;
			poz = H[*it1];
			update(1, 1, N);
		}

	if(it2 != Sp.end())
		if(it1 != S.end())
		{
//			fprintf(stderr, "%d %d %d\n", *it1, -*it2, H[-*it2]);
			val = *it2 + *it1;
			poz = H[*it1];
			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");
		return;
	}

	set<int>::iterator it1 = S.begin();
	set<int>::reverse_iterator it2 = S.rbegin();
	printf("%d\n", *it2 - *it1);
}

void find_min()
{
	if(S.size() < 2)
	{
		printf("-1\n");
		return;
	}

	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);

/*	for(int i = 1; i <= T; ++i)
		printf("%d %d\n", Q[i].t, Q[i].n);*/

	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();
}