Cod sursa(job #81563)

Utilizator gigi_becaliGigi Becali gigi_becali Data 2 septembrie 2007 23:56:25
Problema Zeap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <cstdio>
#include <set>
#include <map>
#include <string>
#define lb lower_bound
#define up upper_bound
using namespace std;

set<int>a;
map<int, int> b;

int main()
{
freopen("zeap.in","r",stdin);
freopen("zeap.out","w",stdout);
	char ax[64], *p;
	int v;
	set<int>::iterator low, up,it;
while(!feof(stdin))
{
	gets(ax);
	//puts(ax);
	
	if(ax[0]=='I')
	{
		p=strtok(ax, " ");
		p=strtok(0, " \n");
		v=atoi(p);
		a.insert(v);
		if(a.size()>=2)
		{
			low=a.lb(v);
			up=a.lb(v);
			if(low!=a.begin()) --low;
			it=up;
			++it;
			
			
			if(it!=a.end()) ++up;
			it=a.find(v);
		//	printf("%d %d %d---\n",*low, *it, *up); 
		
			if(*up-*low>0) {--b[*up-*low]; if(b[*up-*low]==0) b.erase(*up-*low);}
			if(*it-*low>0) ++b[*it-*low];
			if(*up-*it>0) ++b[*up-*it];
		}
	}
	
	if(ax[0]=='S')
	{
		
		p=strtok(ax, " ");
		p=strtok(0, " \n");
		v=atoi(p);
		it=a.find(v);
		if(it==a.end())printf("-1\n");
		else
		{
		if(a.size()>=2)
		{
			
			low=a.lb(v);
			up=a.lb(v);
			if(low!=a.begin()) --low;
			it=up;
			++it;
			
			if(it!=a.end()) ++up;
			
			it=a.find(v);
			
		//	printf("(s %d)\n",*up-*low); 
			
			if(*it-*low>0) {--b[*it-*low];if(b[*it-*low]==0) b.erase(*it-*low);}
			if(*up-*it>0) {--b[*up-*it]; if(b[*up-*it]==0) b.erase(*up-*it);}
			if(*up-*low>0) ++b[*up-*low];
		}
			a.erase(v);
		}
	}
	
	if(ax[0]=='C')
	{
		p=strtok(ax, " ");
		p=strtok(0, " \n");
		v=atoi(p);
		if(a.find(v)==a.end())printf("0\n");
		else printf("1\n");
		
	}
	
	
	if(ax[0]=='M')
	{
		if(ax[1]=='A')
		{
			
			low=a.begin();
			up=a.end();
			--up;
			printf("%d\n", *up-*low);
			
			
		}
		if(ax[1]=='I')
		{
			
			map<int, int>::iterator itt;
			
			for(itt=b.begin();itt!=b.end();++itt)
				if(itt->second>=0){printf("%d\n", itt->first); break;}
				/*
			if(b.size())
			{
				
			itt=b.begin();
			printf("%d\n", itt->first);
			}
			*/
		}
	}
	//printf("map:\n");
		//	for(map<int, int>:: iterator itt=b.begin();itt!=b.end();++itt)printf("(%d %d)", itt->first, itt->second);
			
			//printf("endmap\n");
}

	
	
	

	return 0;
}