Pagini recente » Cod sursa (job #398087) | Cod sursa (job #1718161) | Cod sursa (job #2575197) | Cod sursa (job #1320558) | Cod sursa (job #1508619)
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
using namespace std;
FILE *f = fopen ( "zeap.in", "r" );
FILE *g = fopen ( "zeap.out", "w" );
set < int > Set; // sirul sortat ( insert + delete + search )
map < int, int > Map; // tin aparitia fiecare diferente de valori
priority_queue < int > Heap; // tin valorile minime pentru ultima cerinta
char s[20], *p;
int ReadInt (){
while ( *p < '0' || *p > '9' )
p++;
int nr = 0;
while ( *p >= '0' && *p <= '9' ){
nr = nr * 10 + ( *p - '0' );
p++;
}
return nr;
}
int main(){
int x, val;
set < int > :: iterator it, it1, it2;
while ( fgets(s, 20, f) != NULL ){
p = s;
if ( s[0] == 'I' ){ // Insert
x = ReadInt();
if ( Set.find(x) != Set.end() ) //daca deja exista elementul, trec peste
continue;
it = Set.insert( Set.begin(), x ); // vad unde il insereaza
it1 = it; it1--; // iau elementul din stanga curentului
it2 = it; it2++; // iau elementul din dreapta curentului
//daca elementul nu e nici primul nici ultimul
if ( it != Set.begin() && it2 != Set.end() ){
val = abs( *it2 - *it1 );
Map[val]--; // am stricat diferenta dintre numerele intre care l-am inserat
}
//daca NU e primul
if ( it != Set.begin() ){
val = abs( *it - *it1 );
Map[val]++; //adaug diferenta facuta cu stanga in Heap
if ( Map[val] == 1 )
Heap.push(-val);
}
//daca NU e ultimul
if ( it2 != Set.end() ){
val = abs( *it2 - *it );
Map[val]++; //adaug diferenta facuta cu dreapta in Heap
if ( Map[val] == 1 )
Heap.push(-val);
}
continue;
}
if ( s[0] == 'S' ){ // Delete
x = ReadInt();
it = Set.find(x);
if ( it != Set.end() ){ //daca exista elementul
it1 = it; it1--; // iau elementul din stanga curentului
it2 = it; it2++; // iau elementul din dreapta curentului
//daca elementul nu e nici primul nici ultimul
if ( it != Set.begin() && it2 != Set.end() ){
val = abs( *it2 - *it1 );
Map[val]++; // adaug diferenta dintre numerele dintre care l-am sters
if ( Map[val] == 1 )
Heap.push(-val);
}
//daca NU e primul
if ( it != Set.begin() ){
val = abs( *it - *it1 );
Map[val]--; // scot valoarea pe care o facea cu stanga
}
//daca NU e ultimul
if ( it2 != Set.end() ){
val = abs( *it2 - *it );
Map[val]--; //scot valoarea pe care o facea cu dreapta
}
//sterg efectiv
Set.erase(it);
}
else
fprintf ( g, "-1\n" );
continue;
}
if ( s[0] == 'C' ){ //cautare
x = ReadInt();
if ( Set.find(x) != Set.end() )
fprintf ( g, "1\n" );
else
fprintf ( g, "0\n" );
continue;
}
if ( s[1] == 'A' ){ //daca vreau maxim, iau capetele
if ( Set.size() < 2 )
fprintf ( g, "-1\n" );
else{
it = Set.end();
it--;
fprintf ( g, "%d\n", abs ( *Set.begin() - *it ) );
}
continue;
}
if ( s[1] == 'I' ){ //daca vreau minim
if ( Set.size() < 2 )
fprintf ( g, "-1\n" );
else{
//scot din heap toate elementele care au fost eliminate pe parcurs
while ( !Heap.empty() && Map[-Heap.top()] <= 0 )
Heap.pop();
fprintf ( g, "%d\n", -Heap.top() );
}
continue;
}
}
return 0;
}