Cod sursa(job #2097680)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 1 ianuarie 2018 12:57:26
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.76 kb
#include <bits/stdc++.h>

std::set <int> mySet;
int count;
std::multiset <int> diff;
int main(){
    FILE*fi,*fo;
    fi = fopen("zeap.in","r");
    fo = fopen("zeap.out","w");

    char c = fgetc(fi);
    while(c == 'I' || c == 'S' || c == 'C' || c == 'M'){
        if(c == 'I'){
            int x;
            fscanf(fi,"%d", &x);
            auto it = mySet.find(x);
            if(it == mySet.end()){
                if(count >= 1){
                    if(x < *mySet.begin())
                        diff.insert(*mySet.begin() - x);
                    else if(x > *mySet.rbegin())
                        diff.insert(x - *mySet.rbegin());
                    else{
                        auto it1 = mySet.lower_bound(x), it2 = mySet.upper_bound(x);
                        it1--;
                        diff.erase(diff.find(*it2 - *it1));
                        diff.insert(x - *it1);
                        diff.insert(*it2 - x);
                    }
                }
                count++;
                mySet.insert(x);
            }
        }
        else if(c == 'S'){
            int x;
            fscanf(fi,"%d", &x);
            auto it = mySet.find(x);
            if(it != mySet.end()){
                if(count >= 2){
                    if(x == *mySet.begin()){
                        auto it = mySet.begin(); it++;
                        diff.erase(diff.find(*it - x));
                    }
                    else if(x == *mySet.rbegin()){
                        auto it = mySet.rbegin(); it--;
                        diff.erase(diff.find(x - *it));
                    }
                    else{
                        auto it1 = mySet.lower_bound(x), it2 = mySet.upper_bound(x);
                        it1--;
                        diff.insert(*it2 - *it1);
                        diff.erase(diff.find(x - *it1));
                        diff.erase(diff.find(*it2 - x));
                    }
                }
                count--;
                mySet.erase(it);
            }
            else
                fprintf(fo,"-1\n");
        }
        else if(c == 'C'){
            int x;
            fscanf(fi,"%d", &x);
            auto it = mySet.find(x);
            if(it != mySet.end())
                fprintf(fo,"1\n");
            else
                fprintf(fo,"0\n");
        }
        else{
            c = fgetc(fi);
            if(count < 2)
                fprintf(fo,"-1\n");
            else if(c == 'A')
                fprintf(fo,"%d\n", *mySet.rbegin() - *mySet.begin());
            else
                fprintf(fo,"%d\n", *diff.begin());
            fgetc(fi);
        }
        fgetc(fi);
        c = fgetc(fi);
    }

    fclose(fi);
    fclose(fo);
    return 0;
}