Pagini recente » Cod sursa (job #2315228) | Cod sursa (job #1845651) | Cod sursa (job #2159858) | Cod sursa (job #680255) | Cod sursa (job #1608512)
#include <fstream>
#include <iostream>
#include <set>
#include <string>
using namespace std;
struct zeap
{
set< int > v;
multiset< int > diff;
void insert(int);
int erase(int);
bool find(int);
int max_dif();
int min_dif();
};
zeap v;
int getInt(const string&);
int main()
{
int val;
string buff;
ifstream fin("zeap.in");
ofstream fout("zeap.out");
while(getline(fin, buff))
{
switch(buff[0])
{
case 'I':
val = getInt(buff);
v.insert(val);
break;
case 'S':
val = getInt(buff);
if(v.erase(val) == -1) fout << -1 << '\n';
break;
case 'C':
val = getInt(buff);
fout << v.find(val) << '\n';
break;
default:
if(buff[1] == 'A')
fout << v.max_dif() << '\n';
else
fout << v.min_dif() << '\n';
break;
}
}
return 0;
}
int getInt(const string& s)
{
int x, pos;
for(x = 0, pos = s.find(' ') + 1; pos < s.length(); ++pos)
x = x * 10 + s[pos] - '0';
return x;
}
void zeap::insert(int x)
{
auto ret = v.insert(x);
if(ret.second == false) return;
set< int >::iterator it1, it2, it3;
it1 = it2 = it3 = ret.first;
--it1; ++it3;
if(it2 != v.begin() && it3 != v.end())
{
diff.erase(diff.find((*it3) - (*it1)));
}
if(it2 != v.begin())
{
diff.insert((*it2) - (*it1));
}
if(it3 != v.end())
{
diff.insert((*it3) - (*it2));
}
}
int zeap::erase(int x)
{
auto it = v.find(x);
if(it == v.end()) return -1;
set< int >::iterator it1, it2, it3;
it1 = it2 = it3 = it;
--it1; ++it3;
if(it2 != v.begin() && it3 != v.end())
{
diff.insert((*it3) - (*it1));
}
if(it2 != v.begin())
{
diff.erase(diff.find((*it2) - (*it1)));
}
if(it3 != v.end())
{
diff.erase(diff.find((*it3) - (*it2)));
}
v.erase(it);
return 0;
}
bool zeap::find(int x)
{
return v.find(x) != v.end();
}
int zeap::max_dif()
{
return v.size() < 2 ? -1 : ((*v.rbegin()) - (*v.begin()));
}
int zeap::min_dif()
{
return v.size() < 2 ? -1 : *diff.begin();
}