Pagini recente » Cod sursa (job #1577854) | Cod sursa (job #1259399) | Cod sursa (job #446288) | Cod sursa (job #2026163) | Cod sursa (job #236936)
Cod sursa(job #236936)
#include <cstdio>
#include <cstring>
using namespace std;
#define FIN "heapuri.in"
#define FOUT "heapuri.out"
#define MAX_N 200000
int H[MAX_N];
int P[MAX_N];
int C[MAX_N];
int N, K;
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])
{
P[H[c]] = s, P[H[s]] = c;
int ax = H[c]; H[c] = H[s], H[s] = ax;
c = s;
}
else return;
}
}
void lift (int c)
{
while (c > 1)
{
int t = c >> 1;
if (H[c] < H[t])
{
P[H[c]] = t, P[H[t]] = c;
int ax = H[c]; H[c] = H[t], H[t] = ax;
c = t;
}
else c = 1;
}
}
void insert (int c)
{
H[++K] = c;
P[c] = K;
lift (K);
}
void dispose (int p)
{
H[p] = H[K--];
P[H[K + 1]] = p;
if (H[p] < H[p >> 1] && p > 1) lift (p);
else sink (p);
}
int main ()
{
int cod, x, ind = 0;
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) insert (x), C[++ind] = x;
else dispose (P[C[x]]);
}
}
return 0;
}