Pagini recente » Cod sursa (job #1180751) | Winter Challenge 2008 | Cod sursa (job #1193996) | Cod sursa (job #753090) | Cod sursa (job #1174784)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
#define Inf 0x3f3f3f3f
class TSolution
{
public:
void Insert(int iValue);
void Delete(int iValue);
void Search(int iValue);
void Min_dif();
void Max_dif();
public:
int m_iNr;
set<int> m_vZeap;
protected:
multiset<int> m_vZ;
};
//-----------------------------------------------------------------
void TSolution::Insert(int iValue)
{
set<int> :: iterator it,i1,i2;
if (m_vZeap.size()==0)
{
m_vZeap.insert(iValue);
return ;
}
i2=m_vZeap.lower_bound(iValue);
if (*i2==iValue)
return;
i1=i2;
if (i1!=m_vZeap.begin())
--i1;
if (i2!=m_vZeap.end())
m_vZ.insert(abs(*i2-iValue));
if (i1!=i2)
m_vZ.insert(abs(*i1-iValue));
m_vZeap.insert(iValue);//insereaza
}
//-----------------------------------------------------------------
void TSolution::Delete(int iValue)
{
set<int> :: iterator it,it1,it2;
multiset<int> :: iterator a1,a2;
it=m_vZeap.find(iValue);
if (it==m_vZeap.end())//nu l-am gasit
{
printf("-1\n");
return;
}
it1=it;
if (it1!=m_vZeap.begin())
--it1;
it2=it;
++it2;
if (it2!=m_vZeap.end())
m_vZ.erase(m_vZ.find(abs(*it2-iValue)));
if (it1!=it)
m_vZ.erase(m_vZ.find(abs(iValue-*it1)));
if (it2!=m_vZeap.end() && it1!=it)
m_vZ.insert(*it2-*it1);
m_vZeap.erase(*it); //sterge
}
//-----------------------------------------------------------------
void TSolution::Search(int iValue)
{
set<int> :: iterator it;
it=m_vZeap.find(iValue);
if (it==m_vZeap.end())
printf("0\n");
else
printf("1\n");
}
//-----------------------------------------------------------------
void TSolution::Max_dif()
{
set<int> :: iterator it,it2;
it=m_vZeap.end();
--it;
it2=m_vZeap.begin();//ultimul-primul
printf("%d\n", *it-*(m_vZeap.begin()));
}
//-----------------------------------------------------------------
void TSolution::Min_dif()
{
printf("%d\n",*(m_vZ.begin()));
}
//-----------------------------------------------------------------
int main()
{
int i,x;
freopen("zeap.in","r",stdin);
freopen("zeap.out","w",stdout);
TSolution * objSolution = new TSolution();
//memset(zeap,0,sizeof(zeap));
objSolution->m_iNr=0;
char czString[20];
while(gets(czString))
{
//gets(s);
i=0;
if (czString[0]=='I')//insert
{
i=2;
x=0;
while(czString[i]>='0' && czString[i]<='9')
{
x=x*10+czString[i]-'0';
i++;
}
objSolution->Insert(x);
}
else
if (czString[0]=='S')//sterge
{
i=2;
x=0;
while(czString[i]>='0' && czString[i]<='9')
{
x=x*10+czString[i]-'0';
i++;
}
objSolution->Delete(x);
//printf("-1\n");
}
else
if (czString[0]=='C')//cauta
{
i=2;
x=0;
while(czString[i]>='0' && czString[i]<='9')
{
x=x*10+czString[i]-'0';
i++;
}
//printf("%ld\n", cauta(x));
objSolution->Search(x);
}
else
if (czString[0]=='M' && czString[1]=='A')//max
{
if (objSolution->m_vZeap.size()<2)
printf("-1\n");
else
//printf("%d\n", max_dif());
objSolution->Max_dif();
}
else
if (czString[0]=='M' && czString[1]=='I')//min
{
if (objSolution->m_vZeap.size()<2)
printf("-1\n");
else
//printf("%d\n", min_dif());
objSolution->Min_dif();
}
}
fclose(stdin);
fclose(stdout);
return 0;
}