Pagini recente » Cod sursa (job #2896546) | Cod sursa (job #2816498) | Cod sursa (job #2404366) | Cod sursa (job #1004007) | Cod sursa (job #889398)
Cod sursa(job #889398)
#include <fstream>
#include <queue>
#include <set>
#include <cstdlib>
using namespace std;
ifstream fin("zeap.in");
ofstream fout("zeap.out");
const int lmax= 12;
set <int> s;
priority_queue <int, vector <int>, greater <int> > h, rm;
char *buffer;
int read_char(){
while (*buffer!=0&& (*buffer<'A'|| *buffer>'Z')){
++buffer;
}
if (*buffer==0){
return -1;
}
if (*buffer=='M'){
buffer+= 3;
return *(buffer-1);
}else{
++buffer;
return *(buffer-1);
}
}
int read_int(){
while (*buffer<'0'|| *buffer>'9'){
++buffer;
}
int x= 0;
while (*buffer>='0'&& *buffer<='9'){
x= x*10+*buffer-'0';
++buffer;
}
return x;
}
void h_erase(int x){
rm.push(x);
while (rm.empty()==0&& h.top()==rm.top()){
h.pop(); rm.pop();
}
}
int main(){
fin.seekg(0, ios::end);
int fs= fin.tellg();
fin.seekg(0, ios::beg);
buffer= (char*)malloc(fs);
fin.getline(buffer, fs, 0);
int ch= read_char();
while (ch!=-1){
//printf("%d:\n", ind);
if (ch=='I'){
int x= read_int();
set <int>::iterator it= s.find(x);
if (it==s.end()){
s.insert(x);
//printf("s+: %d\n", x);
it= s.find(x);
if (s.size()>1){
if (it==s.begin()){
++it;
h.push(*it-x);
//printf("ms+: %d\n", *it-x);
}else if (++it==s.end()){
--it; --it;
h.push(x-*it);
//printf("ms+: %d\n", x-*it);
}else{
int aux= *it;
--it; --it;
h.push(aux-x);
h.push(x-*it);
h_erase(aux-*it);
/*printf("ms+: %d\n", aux-x);
printf("ms+: %d\n", x-*it);
printf("ms-: %d\n", aux-*it);*/
}
}
}
}else if (ch=='S'){
int x= read_int();
set <int>::iterator it= s.find(x);
if (it==s.end()){
fout<<"-1\n";
}else{
if (s.size()>1){
if (it==s.begin()){
++it;
h_erase(*it-x);
//printf("ms-: %d\n", *it-x);
}else if (++it==s.end()){
--it; --it;
h_erase(x-*it);
//printf("ms+: %d\n", x-*it);
}else{
int aux= *it;
--it; --it;
h_erase(aux-x);
h_erase(x-*it);
h.push(aux-*it);
/*printf("ms-: %d\n", aux-x);
printf("ms-: %d\n", x-*it);
printf("ms+: %d\n", aux-*it);*/
}
}
s.erase(x);
//printf("s-: %d\n", x);
}
}else if (ch=='C'){
int x= read_int();
set <int>::iterator it= s.find(x);
if (it==s.end()){
fout<<"0\n";
}else{
fout<<"1\n";
}
}else{
if (s.size()<2){
fout<<"-1\n";
}else if (ch=='X'){
set <int>::iterator it_b= s.begin(), it_e= s.end();
--it_e;
//printf("%d %d\n", *it_b, *it_e);
fout<<*it_e-*it_b<<"\n";
}else{
fout<<h.top()<<"\n";
}
}
ch= read_char();
}
return 0;
}