Pagini recente » Cod sursa (job #2416940) | Istoria paginii utilizator/cioarec_george | Monitorul de evaluare | Cod sursa (job #229025) | Cod sursa (job #388963)
Cod sursa(job #388963)
#include <cstdio>
#include <algorithm>
#define DIM 200005
using namespace std;
int H [DIM], Pos [DIM], A [DIM], N, D;
inline int left (int x) { return (x << 1) ;}
inline int right (int x) { return ((x << 1) + 1);}
inline int father (int x) { return (x >> 1);}
void insert_up (int k, int key)
{
int F;
F = father (k);
if ( key < A [H [F]] && k > 1) // HF :)
{
Pos [H[k]] = F;
Pos [H[F]] = k;
swap (H [k], H [F]);
insert_up (F, key);
}
}
void insert_down (int k, int key)
{
int L, R, minim = k;
L = left (k);
R = right (k);
if (A [H [L]] < key) minim = L;
if (A [H [R]] < A [H [L]] && A [H [R]] < key) minim = R;
if (minim != k && k < N ) {
Pos [H[k]] = minim;
Pos [H[minim]] = k;
swap (H [k], H [minim]);
insert_down (minim, key);
}
}
void cut (int &N, int K)
{
H [K] = H [N]; // OMG ! HD? :))
--N;
//printf ("***** %d\n", Pos [K]);
insert_up (Pos [K], A [H [K]]);
insert_down (Pos [K], A [H [K]]);
}
int main ()
{
int x, M, tip;
freopen ("heapuri.in", "r", stdin);
freopen ("heapuri.out", "w", stdout);
scanf ("%d\n", &M);
for ( ; M--; ) {
scanf ("%d", &tip);
if (tip == 3) printf ("%d\n", A [ H[1] ]);
else
{
scanf ("%d", &x);
if (tip == 1)
{
A [++N] = x;
H [++D] = N;
Pos [N] = D;
insert_up (D, A [N]);
}
else if (tip == 2)
{
//printf ("** ");
A [x] = -1;
cut (D, Pos [x]);
//printf ("pozitia: %d\n", Pos [x]);
}
//for (int i = 1; i <= D; i++) printf ("%d ", A[H [i]]);
//printf ("\n");
}
}
return 0;
}