Cod sursa(job #2239533)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 11 septembrie 2018 00:55:05
Problema Zeap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <bits/stdc++.h>

#define BufferSize 25

std::ifstream InFile("zeap.in");
std::ofstream OutFile("zeap.out");

std::set <int> ElementSet;
std::multiset <int> DiffSet;

std::set <int>::iterator SwapIt1, SwapIt2;

char Buffer[BufferSize];
int GetInt() {
    char *p = Buffer;
    while(p && !isdigit(*p)) p++;

    int x = 0;
    while(p && isdigit(*p)) {
        x = x*10 + *p - '0';
        p++;
    }   return x;
}

void Insereaza(int Value) {
    if(ElementSet.size() == 0) {
        ElementSet.insert(Value);
        return;
    }
}
void Sterge(int Value) {
    std::set <int>::iterator ValueIt = ElementSet.find(Value);
    if(ValueIt == ElementSet.end()) {
        OutFile << -1 << '\n';
        return;
    }
    ElementSet.erase(ValueIt);

    if(Value > *ElementSet.rbegin()) {
        DiffSet.erase(Value - *ElementSet.rbegin());
        return;
    }
    if(Value < *ElementSet.begin()) {
        DiffSet.erase(-Value + *ElementSet.begin());
        return;
    }

    SwapIt1 = ElementSet.upper_bound(Value);
    SwapIt2 = SwapIt1; SwapIt2--;
    DiffSet.insert(*SwapIt1 - *SwapIt2);
    DiffSet.erase(DiffSet.find(Value - *SwapIt2));
    DiffSet.erase(DiffSet.find(*SwapIt1 - Value));
}

bool Cauta(int Value) {
    return (ElementSet.count(Value) > 0);
}
int MaxDif() {
    return (ElementSet.size() > 1 ? *ElementSet.rbegin() - *ElementSet.begin() : -1);
}
int MinDif() {
    return (DiffSet.size() > 0 ? *DiffSet.begin() : -1);
}

void Rezolvare() {
    while(InFile.getline(Buffer, BufferSize)) {
        if(strlen(Buffer) < 3) continue;

        if (Buffer[0] == 'I') {
            Insereaza(GetInt());
        } else
        if (Buffer[0] == 'S') {
            Sterge(GetInt());
        } else
        if (Buffer[0] == 'C') {
            OutFile << Cauta(GetInt()) << '\n';
        } else
        if (Buffer[1] == 'I') {
            OutFile << MinDif() << '\n';
        } else
        if (Buffer[1] == 'A') {
            OutFile << MaxDif() << '\n';
        }
    }
}

int main()
{
    Rezolvare();

    return 0;
}