Cod sursa(job #1437629)

Utilizator theprdvtheprdv theprdv Data 18 mai 2015 06:46:16
Problema Zeap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.74 kb
#include <fstream>
#include <algorithm>

using namespace std;

fstream fout("zeap.out", ios::out);
#define MAXN 300001

struct node{
	long long l, r, max, min = ~(1 << 31),
		maxD, minD = ~(1 << 31), ct;
} T[MAXN * 3];
char *buf, *p;
int val, pos, N, A[MAXN], aux;
bool found, del, ins, used[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();
}

void get_val(node &CR, node LS, node RS){
	CR.max = max(LS.max, RS.max);
	CR.min = min(LS.min, RS.min);
	CR.ct = LS.ct + RS.ct;
}

void build(int n, int l, int r){
	if (l == r){
		T[n].l = T[n].r = val;
		return;
	}
	int mid = (l + r) / 2;
	if(pos <= mid) build(n * 2, l, mid);
	else build(n * 2 + 1, mid + 1, r);

	T[n].l = T[n * 2].l;
	T[n].r = T[n * 2 + 1].r;
}

void update(int n, int l, int r){
	if (l == r){
		if (T[n].ct) found = 1;
		if (del) T[n].max = T[n].maxD = T[n].ct = 0, T[n].min = T[n].minD = ~(1 << 31);
		if (ins) T[n].max = T[n].min = val, T[n].ct = 1;
		return;
	}
	int mid = l + r >> 1;
	if (val <= T[n * 2].r) update(n * 2, l, mid);
	else update(n * 2 + 1, mid + 1, r);


	get_val(T[n], T[n * 2], T[n * 2 + 1]);
	if (T[n * 2].ct && T[n * 2 + 1].ct)
		T[n].maxD = max(max(T[n << 1].maxD, T[n * 2 + 1].maxD), abs(T[n * 2 + 1].max - T[n << 1].min)),
		T[n].minD = min(min(T[n << 1].minD, T[n * 2 + 1].minD), abs(T[n * 2 + 1].min - T[n << 1].max));
	else if (!T[n * 2].ct) aux = T[n].l, T[n] = T[n * 2 + 1], T[n].l = aux;
	else aux = T[n].r, T[n] = T[n * 2], T[n].r = aux;;
}
int main()
{
	read();
	p = buf;

	while (*p != -3) A[++A[0]] = read_num(); // <--
	--A[0]; N = A[0];
	sort(A + 1, A + A[0] + 1);
	for (int i = 2; i <= A[0]; ++i)
		if (A[i] == A[i - 1]) --N;
	for (int i = 1; i <= A[0]; ++i)
		if ((A[i] != A[i - 1]) || i == 1)
			val = A[i],
			++pos,
			build(1, 1, N);

	p = buf;
	while (*p != -3){
		string act = read_char();
		found = ins = del = 0;
		if (act == "I" || act == "S" || act == "C"){
			if (act == "I") ins = 1;
			if (act == "S") del = 1;
			val = read_num();
			update(1, 1, N);
			if (act == "S" && !found) fout << "-1\n";
			if (act == "C") found ? fout << "1\n" : fout << "0\n";
		}
		else if (act == "MAX") fout << T[1].maxD << "\n";
		else fout << T[1].minD << "\n";
	}

	fout.close();
	return 0;
}