Pagini recente » Profil PlatonV | Istoria paginii utilizator/sergiu10 | Monitorul de evaluare | Atasamentele paginii Profil sabinaioana | Cod sursa (job #1431036)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f( "heapuri.in" ,ios::in);
ofstream g ("heapuri.out" ,ios::out);
const int MAX = 200002;
int HEAP [MAX] , POS [ MAX ] ,L[ MAX ] ,sz , cont;
void mySwap ( int &i ,int j){
int aux ;
aux = HEAP [ i ];
HEAP [ i ] = HEAP [ j ];
HEAP [ j ] = aux;
aux = L [ i ];
L [ i ] = L [ j ];
L [ j ] = aux ;
aux = POS [ L [ i ] ];
POS [ L [ i ] ] = POS [ L[ j ] ];
POS [ L [ j ] ] = aux;
i = j;
}
void upHEAP( int i ){
while ( i > 1 && HEAP [ i ] < HEAP [ i/2 ] ){
mySwap( i, i/2 );
}
}
void downHEAP ( int &i){
bool FINHEAPED = 0;
int j;
while ( !FINHEAPED && 2*i <= sz ){
FINHEAPED = 1;
if ( HEAP [ i ] > HEAP [ 2*i ] ){
FINHEAPED = 0;
j = 2*i;
}
if ( 2*i + 1 <= sz && HEAP [ i ] > HEAP [ 2*i + 1 ] && HEAP [ 2*i+1 ] < HEAP [ 2*i ] ){
FINHEAPED = 0;
j = 2*i + 1;
}
if(!FINHEAPED){
mySwap( i , j );
}
}
}
void insertHP ( int h ){
HEAP [ sz ] = h;
int i = sz ;
upHEAP( i );
}
void show(){
g<<HEAP [ 1 ]<<"\n";
}
//2 contoare dif unul pt heap cell pt rest
void deleteHP ( int poz ){
int i = POS [ poz ];
int j = i;
mySwap( i , sz );
sz--;
// cont++;
upHEAP( j );
downHEAP( j );
}
int main()
{
int n,x,y;
f>>n;
while (n--){
f>>x;
if(x == 1){
f>>y;
cont++;
sz++;
POS [ cont ] = sz ;
L [ sz ] = cont ;
insertHP ( y );
}
if( x == 2){
f>>y;
deleteHP( y ) ;
}
if( x== 3)
show();
}
return 0;
}