Cod sursa(job #1328573)
Utilizator | Data | 28 ianuarie 2015 15:46:18 | |
---|---|---|---|
Problema | Zeap | Scor | 10 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 4.28 kb |
#include <fstream>
#include <string>
#include <cstring>
#include <map>
#include <algorithm>
#include <vector>
using namespace std;
ifstream f("zeap.in");
ofstream g("zeap.out");
int x,st,dr,val;
map<int,map<int,int> > m;
map<int,int> dif;
map<int,int> caut;
map<int,int>::iterator it;
vector<pair<int,int> > vs;
void differ(int val,int x)
{
map<int,int>::iterator itt=caut.lower_bound(val);
if(itt!=caut.end())
{
++itt;
if (itt!=caut.end())
{
st=itt->first;
++dif[abs(st-val)];
m[val][st]++;
m[st][val]++;
}
}
}
int main()
{
string s;
while(f>>s)
{
if (s == "I")
{
f>>x;
it=caut.lower_bound(x);
if (it->first == x)
continue;
++caut[x];
if (it!=caut.end() && it->first != x)
{
dr=it->second;
++dif[abs(dr-x)];
m[x][dr]++;
m[dr][x]++;
}
--it;
--it;
if (it->first != x)
{
st=it->first;
++dif[abs(st-x)];
m[x][st]++;
m[st][x]++;
}
}
else if (s == "S")
{
f>>x;
if (caut[x])
{
/*g<<"***********************************\n";
for(it=caut.begin();it!=caut.end();++it)
g<<it->first<<" ";
g<<'\n';*/
--caut[x];
if (caut[x]==0)
caut.erase(x);
for (it=m[x].begin();it!=m[x].end();++it)
{
val=it->first;
vs.push_back(make_pair(val,x));
--dif[abs(val-x)];
if (dif[abs(val-x)]==0)
dif.erase(abs(val-x));
--m[val][x];
if (m[val][x] == 0)
m[val].erase(x);
}
for (int tt=0;tt<vs.size();++tt)
differ(vs[tt].first,vs[tt].second);
m[x].clear();
/* for(it=dif.begin();it!=dif.end();++it)
g<<it->first<<" ";
g<<'\n';
g<<"***********************************\n";*/
}
else
{
g<<-1<<'\n';
caut.erase(x);
}
}
else if (s == "C"){
f>>x;
if (caut[x])
g<<1<<'\n';
else
{
g<<0<<'\n';
caut.erase(x);
}
}
else if (s == "MIN")
{
if (dif.size())
{
it=dif.begin();
g<<it->first<<'\n';
}
else
g<<-1<<'\n';
}
else if (s == "MAX")
{
if (caut.size()>=2)
{
it=caut.end();
--it;
g<<it->first-caut.begin()->first<<'\n';
}
else
{
g<<-1<<'\n';
}
}
// g<<"*********************************** ";
// for(it=dif.begin();it!=dif.end();++it)
// g<<it->first<<" "<<it->second<<" ";
// g<<'\n';
}
return 0;
}