Mai intai trebuie sa te autentifici.
Cod sursa(job #342969)
Utilizator | Data | 24 august 2009 15:19:35 | |
---|---|---|---|
Problema | Heapuri | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.13 kb |
#include <stdio.h>
#define DIM 200005
int c[DIM], h[DIM], poz[DIM];
int n,m,l;
void swap(int &x, int &y)
{
int tmp=x;
x=y;
y=tmp;
}
void upheap(int nod)
{
if (nod>1) return;
if (c[h[nod]]<c[h[nod/2]])
{
swap(poz[h[nod]],poz[h[nod/2]]);
swap(h[nod],h[nod/2]);
upheap(nod/2);
}
}
void downheap(int nod)
{
int min=nod;
if (l>=2*nod) if (c[h[nod*2]]<c[h[min]]) min=nod*2;
if (l>=2*nod+1) if (c[h[nod*2+1]]<c[h[min]]]) min=nod*2+1;
if (min!=nod)
{
swap(h[nod],h[min]);
swap(poz[h[nod]],poz[h[min]]);
downheap(min);
}
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int i,p,car;
l=0;
scanf("%d",&m);
for (i=1; i<=m; ++i)
{
scanf("%d",&car);
if (car==1)
{
scanf("%d",&p);
c[++n]=p;
poz[h[++l]=n]=l;
upheap(1);
}
else if (car==2)
{
scanf("%d",&p);
h[poz[p]]=h[l--];
poz[h[poz[p]]]=poz[p];
if (poz[p]>l && c[h[poz[p]]],c[h[poz[p]/2]])
upheap(poz[p]);
else downheap(poz[p]);
}
else printf("%d\n",c[h[1]]);
}
return(0);
}