Mai intai trebuie sa te autentifici.
Cod sursa(job #1160818)
Utilizator | Data | 30 martie 2014 20:24:19 | |
---|---|---|---|
Problema | Heapuri | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.33 kb |
#include<cstdio>
#define NMax 200005
using namespace std;
int H[NMax],Pos[NMax],V[NMax];
int HDim,Nr;
void push (int crt)
{
int aux;
while (crt/2 && V[H[crt]]<V[H[crt/2]])
{
aux=H[crt];
H[crt]=H[crt/2];
H[crt/2]=aux;
Pos[H[crt]]=crt;
Pos[H[crt/2]]=crt/2;
crt/=2;
}
}
void pop (int crt)
{
int aux,mini=0;
while (mini!=crt)
{
mini=crt;
if (2*mini<=HDim && V[H[2*mini]]<V[H[crt]])
crt=2*mini;
if (2*mini+1<=HDim && V[H[2*mini+1]]<V[H[crt]])
crt=2*mini+1;
aux=H[mini];
H[mini]=H[crt];
H[crt]=aux;
Pos[H[mini]]=mini;
Pos[H[crt]]=crt;
}
}
int main ()
{
int N,tip,i,x;
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&N);
for (i=1; i<=N; i++)
{
scanf("%d",&tip);
if (tip==1)
{
scanf("%d",&x);
HDim++, Nr++;
V[Nr]=x;
H[HDim]=Nr;
Pos[Nr]=HDim;
push(HDim);
}
else if (tip==2)
{
scanf("%d",&x);
V[x]=-1;
push(Pos[x]);
Pos[x]=0;
H[1]=H[HDim--];
Pos[H[1]]=1;
if (HDim>1) pop(1);
}
else printf("%d\n",V[H[1]]);
}
return 0;
}