Cod sursa(job #1438516)

Utilizator theprdvtheprdv theprdv Data 20 mai 2015 04:44:41
Problema Zeap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.76 kb
#include <fstream>
#include <algorithm>

using namespace std;

fstream fout("zeap.out", ios::out);
#define MAXN 300001
#define left  (n << 1)
#define right (left + 1)
#define mid   ((l + r) >> 1)

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

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

inline string read_char(){
	string val;
	while (!(*p >= 'A' && *p <= 'Z') && *p != -3) ++p; // <--
	for (; *p >= 'A' && *p <= 'Z'; ++p)
		val += *p;
	return val;
}

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

int search(int val){
	int step = LOG, k;

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

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

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

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

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

}

int main()
{
	read();
	p = buf;

	while (*p != -3) B[++B[0]] = read_num(); // <--
	sort(B + 1, B + B[0]);

	for (int i = 1; i < B[0]; ++i)
		if (B[i] != B[i - 1] || i == 1)
			A[++A[0]] = B[i];
	for (LOG = 1; LOG <= A[0]; LOG <<= 1); // <--

	p = buf;
	while (*p != -3){
		string act = read_char();
		if (act == "I" || act == "S" || act == "C"){
			val = read_num();
			pos = search(val);

			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 (T[1].ct > 1){
			act == "MAX" ? fout << T[1].maxD << "\n" : fout << T[1].minD << "\n";
		}
		else fout << "-1\n";
	}

	fout.close();
	return 0;
}