Cod sursa(job #890617)

Utilizator fhandreiAndrei Hareza fhandrei Data 25 februarie 2013 10:48:51
Problema Zeap Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 kb
// Include
#include <cstdio>
#include <set>
#include <map>
using namespace std;

// Variabile
char operation[15];
set<int> elements;
map<int, int> differences;

// Main
int main()
{
	freopen("zeap.in", "rt", stdin);
	freopen("zeap.out", "wt", stdout);
	
	while(gets(operation))
	{
		if(operation[1] == ' ')
		{
			int num;
			sscanf(operation+2, "%d", &num);
			if(operation[0] == 'I')
			{
				if(elements.find(num) != elements.end())
					continue;
				elements.insert(num);
				/*if(elements.size() == 1)
					continue;*/
				set<int>::iterator numPos = elements.find(num);
				set<int>::iterator nextPos = numPos;
				++nextPos;
				if(nextPos != elements.end())
					++differences[*nextPos - *numPos];
				
				if(numPos != elements.begin())
				{
					set<int>::iterator previousPos = numPos;
					--previousPos;
					++differences[*numPos - *previousPos];
					if(nextPos != elements.end())
					{
						--differences[*nextPos - *previousPos];
						if(!differences[*nextPos - *previousPos])
							differences.erase(*nextPos - *previousPos);
					}
				}
				
				continue;
			}	
			
			if(operation[0] == 'S')
			{
				set<int>::iterator numPos = elements.find(num);
				if(numPos == elements.end())
				{
					printf("%d\n", -1);
					continue;
				}
				
				set<int>::iterator nextPos = numPos;
				++nextPos;
				if(nextPos != elements.end())
				{
					--differences[*nextPos - *numPos];
					if(!differences[*nextPos - *numPos])
						differences.erase(*nextPos - *numPos);
				}
				
				if(numPos != elements.begin())
				{
					set<int>::iterator previousPos = numPos;
					--previousPos;
					--differences[*numPos - *previousPos];
					if(!differences[*numPos - *previousPos])
						differences.erase(*numPos - *previousPos);
					if(nextPos != elements.end())
						++differences[*nextPos - *previousPos];
				}
				
				continue;
			}
			
			//if(operation[i] == 'C')
			{
				printf("%d\n", elements.find(num)!=elements.end()? 1:0);
				continue;
			}
			
			continue;
		}
		
		if(operation[1] == 'A') // max
		{
			set<int>::iterator first = elements.begin(), last = elements.end();
			--last;
			printf("%d\n", *last - *first);
			continue;
		}
		
		//if(operation[1] == 'I') // min
		{
			printf("%d\n", differences.begin()->first);
			continue;
		}
		
		continue;
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}