Pagini recente » Cod sursa (job #305486) | Istoria paginii runda/wellcodesimulareclasa9-10martie/clasament | Cod sursa (job #1218699) | Cod sursa (job #882480) | Cod sursa (job #779610)
Cod sursa(job #779610)
#include <stdio.h>
#include <assert.h>
int n,nr,nr2;
int a[200010],heap[200010],poz[200010];
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;
poz[heap[x]]=x;
poz[heap[x/2]]=x/2;
x/=2;
}
}
void pop(int x)
{
int aux,y=0;
while (x!=y)
{
y=x;
if (y*2<=nr&&a[heap[x]]>a[heap[y*2]])
x = y*2;
if (y*2+1<=nr&&a[heap[x]]>a[heap[y*2+1]])
x=y*2+1;
aux=heap[x];
heap[x]=heap[y];
heap[y]=aux;
poz[heap[x]]=x;
poz[heap[y]]=y;
}
}
int main()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int i, x,val;
scanf("%d ",&n);
for (i=1;i<=n;i++)
{
scanf("%d ",&val);
if (val<3)
scanf("%d ",&x);
if (val==1)
{
nr++;
nr2++;
a[nr2]=x;
heap[nr]=nr2;
poz[nr2]=nr;
push(nr);
}
if (val==2)
{
a[x]=-1;
push(poz[x]);
poz[heap[1]]=0;
heap[1]=heap[nr--];
poz[heap[1]]=1;
if (nr>1)
pop(1);
}
if (val==3)
printf("%d\n",a[heap[1]]);
}
return 0;
}