Pagini recente » Cod sursa (job #3131695) | Cod sursa (job #269451) | Cod sursa (job #2515984) | Cod sursa (job #875379) | Cod sursa (job #978978)
Cod sursa(job #978978)
#include <iostream>
#include <fstream>
using namespace std;
#define Nmax 200004
#define Parent(i) i/2
#define LeftSon(i) 2*i
#define RightSon(i) 2*i+1
#define Min(H) H[1]
int position[Nmax];
void InitHeap( int *H )
{
for ( int i = 0; i < Nmax; ++i )
H[i] = 0;
}
void DownHeap( int *H, int N, int poz )
{
int k = poz;
int j;
do
{
j = k;
if ( LeftSon(j) <= N && H[LeftSon(j)] < H[k] ) j = LeftSon(j);
if ( RightSon(j) <= N && H[RightSon(j)] < H[k] ) j = RightSon(j);
swap( H[j], H[k] );
swap( position[j], position[k] );
} while( j != k );
}
void UpHeap( int *H, int N, int poz )
{
int k = poz;
int j;
do
{
j = k;
if ( j > 1 && H[Parent(j)] > H[k] ) j = Parent(j);
swap( H[j], H[k] );
swap( position[j], position[k] );
} while( j != k );
}
void InsertHeap( int *H, int &N, int key, int poz )
{
H[ ++N ] = key;
position[N] = poz;
UpHeap( H, N, N );
}
void DeletePoz( int *H, int &N, int poz )
{
H[1] = H[N];
DownHeap( H, N, 1 );
N--;
}
int main()
{
int H[Nmax], M, N = 0;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
f >> M;
for ( int tip, key, i = 1; i <= M; i++ )
{
f >> tip;
switch( tip )
{
case 1:
f >> key;
InsertHeap( H, N, key, i );
break;
case 2:
f >> key;
DeletePoz(H, N, position[key]);
break;
case 3:
g << Min(H) << "\n";
break;
default: break;
}
}
return 0;
}