Pagini recente » Cod sursa (job #2615067) | Cod sursa (job #520699) | Cod sursa (job #1612749) | Cod sursa (job #2728772) | Cod sursa (job #1438517)
#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;
}