Cod sursa(job #1525497)

Utilizator heracleRadu Muntean heracle Data 15 noiembrie 2015 09:51:11
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 kb
#include <cstdio>
#include <set>
#include <map>


FILE* in=fopen("zeap.in","r");
FILE* out=fopen("zeap.out","w");

///parsare

bool digit[200];
bool letter[200];

void jibril()
{
	for(int i='0'; i<='9'; i++)
		digit[i]=1;
	for(int i='A'; i<='Z'; i++)
		letter[i]=1;
}

const int SBUF=4096;
char BUF[SBUF];
int pbuf=SBUF;

char get_char()
{
	if(pbuf==SBUF)
	{
		pbuf=0;
		fread(BUF,SBUF,1,in);
	}
	return BUF[pbuf++];
}

bool get_string(char v[])
{
	char x;

	x=get_char();

	int cont=0;

	while(!letter[x] && cont<5)
	{
		x=get_char();
		cont++;
	}
	if(cont==5)
		return 0;

	int p=0;
	while(letter[x])
	{
		v[p++]=x;
		x=get_char();
	}
	v[p]=0;
	return 1;
}

int get_int()
{
	int rez=0;

	char x=get_char();

	while(!digit[x])
		x=get_char();

	while(digit[x])
	{
		rez=rez*10+x-'0';
		x=get_char();
	}
	return rez;
}
///parsare

std::set<int> s;
std::multiset<unsigned int> m;

const int INF=2000000002;

int main()
{
	jibril();
	char v[20];

	s.insert(-INF/2);
	s.insert(INF);
	m.insert((unsigned int) (INF+INF/2));

	std::set<int>::iterator it;
	std::multiset<unsigned int>::iterator itmap;
	int x;
	while(fscanf(in,"%s",v)==1)
	{
		if(v[0]=='I')
		{
			//int x=get_int();

			fscanf(in,"%d",&x);

			it=s.upper_bound(x);
			it--;
			if(*it!=x)
			{
				it++;
				int v1,v2;
				v2=*it;
				it--;
				v1=*it;

				itmap=m.upper_bound((unsigned int)(v2-v1) );

				itmap--;

				m.erase(itmap);

				s.insert(x);

				m.insert((unsigned int) (v2-x));
				m.insert((unsigned int) (x-v1));

			}

		}
		else if(v[0]=='S')
		{
		//	int x=get_int();
			fscanf(in,"%d",&x);

			it=s.upper_bound(x);
			it--;

			if(*it==x)
			{
				int v1,v2;
				it++;
				v2=*it;
				it--;
				it--;
				v1=*it;
				it++;
				s.erase(it);

				itmap=m.upper_bound( (unsigned int) (v2-x));
				itmap--;
				m.erase(itmap);

				itmap=m.upper_bound((unsigned int) (x-v1));
				itmap--;
				m.erase(itmap);

				m.insert((unsigned int) (v2-v1));
			}
			else
			{
				fprintf(out,"-1\n");
			}
		}
		else if(v[0]=='C')
		{
		//	int x=get_int();
			fscanf(in,"%d",&x);


			it=s.upper_bound(x);
			it--;

			if(*it==x)
			{
				fprintf(out,"1\n");
			}
			else
			{
				fprintf(out,"0\n");
			}
		}
		else if(v[0]=='M' && v[1]=='A')
		{
			if(s.size()<4)
				fprintf(out,"-1\n");
			else
			{
				int rez=0;
				it=s.end();
				it--;
				it--;
				rez=*it;
				it=s.begin();
				it++;
				rez-=*it;
				fprintf(out,"%d\n",rez);
			}
		}
		else if(v[0]=='M' && v[1]=='I')
		{
			if(s.size()<4)
				fprintf(out,"-1\n");
			else
			{
				itmap=m.begin();

				fprintf(out,"%d\n",*itmap);
			}
		}
		else
			break;

	}

    return 0;

}