Pagini recente » Cod sursa (job #1889228) | Cod sursa (job #2603948) | Cod sursa (job #2696881) | Borderou de evaluare (job #2270086) | Cod sursa (job #3288118)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ( "heapuri.in" );
ofstream fout( "heapuri.out" );
#define cin fin
#define cout fout
#define FR( a, b ) for( int a = 0; a < b; a ++ )
#define FOR( a, c, b ) for( int a = c; a < b; a++)
const int Nmax = 2e5+5, minimul = -1e9;
int heap[Nmax], pozitie[Nmax], val[Nmax];
int marime_heap = 0;
void swap_heap( int poz1, int poz2 ) {
swap( pozitie[ heap[poz1] ], pozitie[ heap[poz2] ] );
swap( heap[ poz1 ], heap[poz2] );
}
void sus( int poz_heap ) {
if( poz_heap == 1 )
return;
int parinte = poz_heap / 2;
while( poz_heap > 1 && val[ heap[parinte] ] > val[ heap[poz_heap] ]) {
swap( pozitie[ heap[poz_heap] ], pozitie[ heap[parinte] ] );
swap( heap[ poz_heap ], heap[ parinte ] );
poz_heap = parinte;
parinte /= 2;
}
}
void jos( int poz_heap ) {
if( 2 * poz_heap > marime_heap )
return;
if( 2 * poz_heap == marime_heap ) {
if( val[ heap[poz_heap] ] > val[ heap[2 * poz_heap] ] )
swap_heap( poz_heap, 2 * poz_heap );
return;
}
while( 2 * poz_heap < marime_heap && val[ heap[poz_heap] ] > min( val[ heap[ 2*poz_heap] ], val[ heap[2 * poz_heap + 1] ] ) ) {
if( val[ heap[ 2*poz_heap] ] < val[ heap[2 * poz_heap + 1] ]) {
swap_heap( poz_heap, 2 * poz_heap );
poz_heap = 2 * poz_heap;
} else {
swap_heap( poz_heap, 2 * poz_heap + 1 );
poz_heap = 2 * poz_heap + 1;
}
}
if( 2 * poz_heap == marime_heap )
if( val[ heap[poz_heap] ] > val[ heap[2 * poz_heap] ] )
swap_heap( poz_heap, 2 * poz_heap );
}
void inserare( int poz ) {
marime_heap++;
heap[ marime_heap ] = poz;
pozitie[ poz ] = marime_heap;
sus( marime_heap );
}
void stergere( int timp ) {
int poz_heap = pozitie[ timp ];
//pozitie[ timp ] = -1;
heap[ poz_heap ] = heap[ marime_heap ];
pozitie[ heap[marime_heap] ] = poz_heap;
marime_heap--;
if( poz_heap == 1 ) {
jos( poz_heap );
return;
}
if( val[ heap[poz_heap] ] < val[ heap[ (poz_heap / 2) ] ] )
sus( poz_heap );
else
jos( poz_heap );
}
void afisare_heap() {
FOR( i, 1, marime_heap + 1 )
cout << i << " " << val[heap[i]] << " " << heap[i] << " pozitie " << '\n';
}
int main() {
heap[0] = minimul;
int n, valoare, timp, operatie;
cin >> n;
timp = 1;
FR( i, n ) {
//cout << "#operatie " << i << "\n";
cin >> operatie;
if( operatie == 1 ) {
cin >> valoare;
val[timp] = valoare;
inserare( timp );
timp++;
} else if( operatie == 2 ) {
cin >> valoare;
stergere( valoare );
} else
cout << val[heap[1]] << '\n';
//afisare_heap();
}
return 0;
}