Pagini recente » Cod sursa (job #3038968) | Cod sursa (job #629902) | Cod sursa (job #2593071) | Cod sursa (job #534237) | Cod sursa (job #234441)
Cod sursa(job #234441)
#include <stdio.h>
#include <algorithm>
using namespace std;
#define NMAX 200020
#define mp make_pair
#define ff first
#define ss second
#define mp make_pair
int NRI[NMAX];
pair<int, int> H[NMAX];
int N, dimh, cnt;
void push_up(int nod)
{
for (;H[nod / 2] > H[nod]; nod /= 2)
{
swap(H[nod], H[nod / 2]);
NRI[ H[nod].ss ] = nod;
NRI[ H[nod / 2].ss ] = nod / 2;
}
}
void push_down(int nod)
{
int mn;
mn = nod;
if (nod * 2 <= dimh && H[nod * 2] < H[mn]) mn = nod * 2;
if (nod * 2 + 1 <= dimh && H[nod * 2 + 1] < H[mn]) mn = nod * 2 + 1;
if (mn != nod)
{
swap(H[nod], H[mn]);
NRI[ H[nod].ss ] = nod;
NRI[ H[mn].ss ] = mn;
push_down(mn);
}
}
void adauga()
{
int x;
scanf("%d ", &x);
NRI[++cnt] = ++dimh;
H[dimh] = mp(x, cnt);
push_up(dimh);
}
void sterge()
{
int x, P;
scanf("%d ", &x);
P = NRI[x];
swap(H[P], H[dimh]);
NRI[ H[P].ss ] = P;
dimh--;
if (P > 1 && H[ P/2 ] > H[P]) push_up(P);
else push_down(P);
}
int main()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int i, cd;
scanf("%d ", &N);
for (i = 1; i <= N; i++)
{
scanf("%d ", &cd);
if (cd == 1) adauga();
if (cd == 2) sterge();
if (cd == 3) printf("%d\n", H[1].ff);
}
return 0;
}