Cod sursa(job #1438517)

Utilizator theprdvtheprdv theprdv Data 20 mai 2015 07:09:48
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.06 kb
#include <algorithm>
#include <fstream>

using namespace std;

#define MAXN   300001
#define left  (n << 1)
#define right (left + 1)
#define mid   ((l + r) >> 1)

fstream fout("zeap.out", ios::out);
streampos size;

struct node{
	int min, max, minD, maxD, c;
} T[4 * MAXN];
char *buf, *p;
int val, pos, A[MAXN], H[MAXN], LOG;
bool X[MAXN];

void read(){
	fstream file("zeap.in", ios::in | ios::binary | ios::ate);
	size = file.tellg();
	buf = new char[(int)size];
	file.seekg(0, ios::beg);
	file.read(buf, size);
	file.close();
}

inline int read_num(){
	while ((*p > '9' || *p < '0') && *p > 0) ++p; // <--
	int val = 0;
	for (; *p <= '9' && *p >= '0'; ++p)
		val = val * 10 + (*p - '0');
	return val;
}

inline string read_str(){
	while ((*p > 'Z' || *p < 'A') && *p > 0) ++p; // <--
	string val;
	for (; *p <= 'Z' && *p >= 'A'; ++p)
		val += *p;
	return val;
}

void insert(){
	if (!val) return;
	int k;
	for (k = ++H[0]; k > 1 && H[k >> 1] > val; k >>= 1)
		H[k] = H[k >> 1];
	H[k] = val;
}

void get_min(){
	val = H[1];
	H[1] = H[H[0]--];
	for (int k = 1, s; 1; k = s){
		s = k * 2;
		if (H[s] > H[s + 1]) s += 1;
		if (H[k] < H[s] || s > H[0]) break;
		H[k] ^= H[s] ^= H[k] ^= H[s];
	}
}

void search(){
	int step, k = 0;
	for (step = LOG; step; step >>= 1)
		if (A[step + k] < val && step + k <= A[0])
			k += step;
	pos = ++k;
}

void update(int n, int l, int r){
	if (l == r){
		if (X[pos]) T[n].c = 1, T[n].max = T[n].min = val;
		else T[n].c = 0;
		return;
	}
	if (pos <= mid) update(left, l, mid);
	else update(right, mid + 1, r);

	T[n].c = T[left].c + T[right].c;
	T[n].max = T[right].c ? T[right].max : T[left].max;
	T[n].min = T[left].c ? T[left].min : T[right].min;

	if (T[left].c && T[right].c)
		T[n].maxD = T[right].max - T[left].min,
		T[n].minD = T[right].min - T[left].max;
	if (T[right].c > 1 || T[left].c > 1){
		if (T[left].c > 1)
			T[n].maxD = max(T[n].maxD, T[left].maxD),
			T[n].minD = min(T[n].minD, T[left].minD);
		if (T[right].c > 1)
			T[n].maxD = max(T[n].maxD, T[right].maxD),
			T[n].minD = min(T[n].minD, T[right].minD);
	}
	if (!T[left].c)
		T[n].maxD = T[right].maxD, T[n].minD = T[right].minD;
	else if(!T[right].c)
		T[n].maxD = T[left].maxD, T[n].minD = T[left].minD;
}

int main(void)
{
	read();

	p = buf;
	while (*p > 0)
		val = read_num(), insert();
	
	while (H[0]){
		get_min();
		if (val != A[A[0]]) A[++A[0]] = val;
	}
	for (LOG = 1; LOG <= A[0]; LOG <<= 1); // <--

	p = buf;
	while (*p > 0){
		string act = read_str();
		if (act == "I" || act == "S" || act == "C"){
			val = read_num();
			search();
			if (act == "I" && !X[pos])
				X[pos] = 1, update(1, 1, A[0]);
			else if (act == "S"){
				if (X[pos]) X[pos] = 0, update(1, 1, A[0]);
				else fout << "-1\n";
			}
			else if (act == "C")
				X[pos] ? fout << "1\n" : fout << "0\n";
		}
		else if (act == "MIN" || act == "MAX"){
			if (T[1].c > 1)
				act == "MAX" ? fout << T[1].maxD << "\n" : fout << T[1].minD << "\n";
			else fout << "-1\n";
		}
	}

	fout.close();
	return 0;
}