Pagini recente » Cod sursa (job #1276225) | Cod sursa (job #1322728) | Cod sursa (job #653235) | Cod sursa (job #2751654) | Cod sursa (job #2239528)
#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 + 2;
while(!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;
}
if(ElementSet.count(Value) == 0) {
if(Value > *ElementSet.rbegin()) {
DiffSet.insert(Value - *ElementSet.rbegin());
ElementSet.insert(Value);
return;
}
if(Value < *ElementSet.begin()) {
DiffSet.insert(-Value + *ElementSet.begin());
ElementSet.insert(Value);
return;
}
SwapIt1 = ElementSet.upper_bound(Value);
SwapIt2-- = SwapIt1;
DiffSet.erase(DiffSet.find(*SwapIt1 - *SwapIt2));
DiffSet.insert(Value - *SwapIt2);
DiffSet.insert(*SwapIt1 - Value);
ElementSet.insert(Value);
}
}
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 (ElementSet.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;
}