Cod sursa(job #1438515)

Utilizator theprdvtheprdv theprdv Data 20 mai 2015 04:17:26
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.58 kb
#include <algorithm>
#include <fstream>
using namespace std;

const char iname[] = "zeap.in";
const char oname[] = "zeap.out";

#define MAX_N   300001
#define MAX_BUF 4000000
#define INF     (int(1e9))
#define left  (n << 1)
#define right (left + 1)
#define mid   ((st + dr) >> 1)

int  H[MAX_N]; // heap
int  A[MAX_N], X[MAX_N];
int  T[MAX_N * 3], Min[MAX_N * 3], Max[MAX_N * 3], MaxDif[MAX_N * 3], MinDif[MAX_N * 3];
int  LOG, V;
char buf[MAX_BUF];
streampos size;

void read(){
	fstream file(iname, ios::in | ios::binary | ios::ate);
	size = file.tellg();
	file.seekg(0, ios::beg);
	file.read(buf, size);
	file.close();
}

inline bool isnum(const char z) {
	return ('0' <= z && z <= '9');
}

inline bool ischar(const char z) {
	return ('A' <= z && z <= 'Z');
}

void rebuild(int H[], int z)
{
	int l, r, k;
	for (;;) {
		l = 2 * z;
		r = 2 * z + 1;
		k = z;
		if (l <= H[0] && H[l] < H[k])
			k = l;
		if (r <= H[0] && H[r] < H[k])
			k = r;
		if (k == z)
			return;
		H[k] ^= H[z] ^= H[k] ^= H[z], z = k;
	}
}

void insert(int H[], const int V)
{
	int k;
	for (k = (++H[0]); k > 1 && H[k >> 1] > V; k >>= 1)
		H[k] = H[k >> 1];
	H[k] = V;
}

int getmin(int H[])
{
	int min = H[1];
	H[1] = H[(H[0]--)];
	if (H[0] > 1)
		rebuild(H, 1);
	return min;
}

int search(const int A[], const int V)
{
	int k;
	int step = LOG;

	for (k = 0; step; step >>= 1)
		if (k + step <= A[0] && A[k + step] < V)
			k += step;
	return (k + 1);
}

void update(int n, int st, int dr, int p)
{
	if (st == dr) {
		if (X[p] == 1) T[n] += 1, Min[n] = Max[n] = V;
		else T[n] -= 1;
		return;
	}
	if (p <= mid) update(left, st, mid, p);
	else update(right, mid + 1, dr, p);

	T[n] = T[left] + T[right];

	Max[n] = T[right] ? Max[right] : Max[left];
	Min[n] = T[left] ? Min[left] : Min[right];

	if (T[left] && T[right])
		MaxDif[n] = Max[right] - Min[left],
		MinDif[n] = Min[right] - Max[left];
	if (T[left] > 1 || T[right] > 1){
		if (T[left] > 1)
			MaxDif[n] = max(MaxDif[n], MaxDif[left]),
			MinDif[n] = min(MinDif[n], MinDif[left]);
		if (T[right] > 1)
			MaxDif[n] = max(MaxDif[n], MaxDif[right]),
			MinDif[n] = min(MinDif[n], MinDif[right]);
	}
	if (!T[left])
		MaxDif[n] = MaxDif[right], MinDif[n] = MinDif[right];
	else if (!T[right]) MaxDif[n] = MaxDif[left], MinDif[n] = MinDif[left];
}

int main(void)
{
	fstream fout(oname, ios::out);
	read();

	int len, k;
	char * p, *lim, ch;
	len = (int)size;

	for (p = buf, lim = buf + len; p < lim;) {
		for (; p < lim && !isnum(*p); ++p);// <--
		if (p < lim) {
			for (V = 0; p < lim && isnum(*p); ++p)
				V = V * 10 + (*p) - '0';
			insert(H, V);
		}
	}
	for (; H[0] > 0;) {
		A[(++A[0])] = getmin(H);
		if (A[0] > 1 && A[A[0]] == A[A[0] - 1])
			A[0] -= 1;
	}

	for (LOG = 1; LOG <= A[0]; LOG <<= 1);// <--

	for (p = buf, lim = buf + len; p < lim;) {
		for (; p < lim && !isnum(*p) && !ischar(*p); ++p);// <--
		if (p == lim)
			break;
		if ((*p) == 'I' || (*p) == 'S' || (*p) == 'C') {
			ch = (*p);
			for (; p < lim && !isnum(*p); ++p);// <--
			for (V = 0; p < lim && isnum(*p); ++p)
				V = V * 10 + (*p) - '0';

			k = search(A, V);
			if (ch == 'I') {
				if (X[k] == 0)
					X[k] = 1, update(1, 1, A[0], k);
			}
			else if (ch == 'S') {
				if (X[k] == 1)
					X[k] = 0, update(1, 1, A[0], k);
				else fout << "-1\n";
			}
			else fout << X[k] << "\n";
		}
		else {
			if (T[1] > 1) {
				if ((*(p + 1)) == 'A')  /* MAX */
					fout << MaxDif[1] << "\n";
				else fout << MinDif[1] << "\n";
			}
			else fout << "-1\n";
			p += 3;
		}
	}

	return 0;
}