Cod sursa(job #889398)

Utilizator MagnvsDaniel Constantin Anghel Magnvs Data 24 februarie 2013 14:46:04
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.75 kb
#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;
}