Pagini recente » Cod sursa (job #2627115) | Cod sursa (job #2170527) | Cod sursa (job #2389501) | Cod sursa (job #3279505) | Cod sursa (job #2163188)
#include <cstdio>
#define NMAX 200002
using namespace std;
int q, L, NR;
int A[NMAX], Heap[NMAX], Pos[NMAX];
void push(int x)
{
int aux;
while(x/2 && A[Heap[x]]<A[Heap[x/2]])
{
aux=Heap[x];
Heap[x]=Heap[x/2];
Heap[x/2]=aux;
Pos[Heap[x]]=x;
Pos[Heap[x/2]]=x/2;
x=x/2;
}
}
void pop(int x)
{
int aux, y=0;
while(x!=y)
{
y=x;
if(y*2<=L && A[Heap[x]]>A[Heap[y*2]]) x=y*2;
if(y*2+1<=L && A[Heap[x]]>A[Heap[y*2+1]]) x=y*2+1;
aux=Heap[x];
Heap[x]=Heap[y];
Heap[y]=aux;
Pos[Heap[x]]=x;
Pos[Heap[y]]=y;
}
}
int main()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int cod,x;
scanf("%d", &q);
while(q)
{
scanf("%d", &cod);
if(cod==1)
{
scanf("%d", &x);
L++;NR++;
A[NR]=x;
Heap[L]=NR;
Pos[NR]=L;
push(L);
}
if(cod==2)
{
scanf("%d", &x);
A[x]=-1;
push(Pos[x]);
Pos[Heap[1]]=0;
Heap[1]=Heap[L--];
Pos[Heap[1]]=1;
if(L>1) pop(1);
}
if(cod==3)
{
printf("%d\n", A[Heap[1]]);
}
q--;
}
return 0;
}