Cod sursa(job #250214)
Utilizator | Data | 30 ianuarie 2009 13:02:16 | |
---|---|---|---|
Problema | Heapuri | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.51 kb |
#include <cstdio>
#include <cstring>
using namespace std;
#define FIN "heapuri.in"
#define FOUT "heapuri.out"
#define MAX_N 200005
int H[MAX_N];
int P[MAX_N];
int C[MAX_N];
int dec[MAX_N];
int N, K, ind;
void sink (int c)
{
while (c << 1 <= K)
{
int s = c << 1;
if (s|1 <= K && H[s] > H[s|1]) s |= 1;
if (H[s] < H[c])
{
int ax;
ax = dec[c], dec[c] = dec[s], dec[s] = ax;
ax = H[c], H[c] = H[s], H[s] = ax;
P[dec[c]] = c, P[dec[s]] = s;
c = s;
}
else return;
}
}
void lift (int c)
{
while (c > 1)
{
int t = c >> 1;
if (H[c] < H[t])
{
int ax;
ax = dec[c], dec[c] = dec[t], dec[t] = ax;
ax = H[c], H[c] = H[t], H[t] = ax;
P[dec[c]] = c, P[dec[t]] = t;
c = t;
}
else c = 1;
}
}
void insert (int c)
{
H[++K] = c;
lift (K);
}
void dispose (int p)
{
H[p] = H[K--];
if (H[p] < H[p >> 1] && p > 1) lift (p);
else sink (p);
}
int main ()
{
int cod, x;
freopen (FIN, "r", stdin);
freopen (FOUT, "w", stdout);
scanf ("%d", &N);
while (N--)
{
scanf ("%d", &cod);
if (cod == 3) printf ("%d\n", H[1]);
else
{
scanf ("%d", &x);
if (cod == 1)
{
C[++ind] = x;
P[ind] = K + 1;
dec[K + 1] = ind;
insert (x);
}
else dispose (P[x]);
}
}
return 0;
}