Pagini recente » Cod sursa (job #2566411) | Cod sursa (job #411521) | Cod sursa (job #1003526) | Cod sursa (job #2799605) | Cod sursa (job #662282)
Cod sursa(job #662282)
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define maxN 200005
int H[maxN] , pozH[maxN] , A[maxN] , dim , dim2 , N;
void push (int nod)
{
int tata = nod / 2;
if (nod == 1)
return;
if (A[H[nod]] >= A[H[tata]])
return;
swap (H[nod] , H[tata]);
swap (nod , tata);
push (tata);
}
void pop (int nod)
{
int fiu1 , fiu2 , nodmin = nod;
fiu1 = nod * 2;
fiu2 = nod * 2 + 1;
nodmin = nod;
if (A[H[fiu1]] < A[H[nodmin]] && fiu1 <= dim)
nodmin = fiu1;
if (A[H[fiu2]] < A[H[nodmin]] && fiu2 <= dim)
nodmin = fiu2;
if (nodmin == nod)
return;
swap (nod , nodmin);
swap (H[nod] , H[nodmin]);
pop (nodmin);
}
void adaug (int x)
{
A[++dim2] = x;
pozH[++dim] = dim;
H[dim] = dim2;
push (pozH[dim]);
}
void sterge (int x)
{
swap (pozH[H[x]] , pozH[H[dim]]);
swap (H[x] , H[dim]);
--dim;
pop (pozH[H[x]]);
push (pozH[H[x]]);
}
int main ()
{
freopen ("heapuri.in" , "r" , stdin);
freopen ("heapuri.out" , "w" , stdout);
scanf ("%d" , &N);
int x , cod;
for (int t = 1 ; t <= N ; ++t)
{
scanf ("%d" , &cod);
if (cod == 1)
{
scanf ("%d" , &x);
adaug (x);
}
if (cod == 2)
{
scanf ("%d" , &x);
sterge (x);
}
if (cod == 3)
printf ("%d\n" , A[H[1]]);
}
return 0;
}