Pagini recente » Cod sursa (job #2853425) | Cod sursa (job #1935660) | Cod sursa (job #1862418) | Cod sursa (job #2138779) | Cod sursa (job #301020)
Cod sursa(job #301020)
#include <stdio.h>
#define N 200001
#define st(x) 2*(x)
#define dr(x) 2*(x)+1
#define tata(x) (x)/2
int heap[N],ele[N],poz[N],vf,vfheap;
void up(int k)
{int aux;
if(k==1)return;
if(ele[heap[tata(k)]]>ele[heap[k]])
{aux=heap[tata(k)];
heap[tata(k)]=heap[k];
heap[k]=aux;
poz[heap[tata(k)]]=tata(k);
poz[heap[k]]=k;
up(tata(k));
}
}
void down(int k)
{int min=k,aux;
if(st(k)<=vfheap&&ele[heap[st(k)]]<ele[heap[min]])
{min=st(k);
}
if(dr(k)<=vfheap&&ele[heap[dr(k)]]<ele[heap[min]])
{min=dr(k);
}
if(min!=k)
{aux=heap[k];heap[k]=heap[min];heap[min]=aux;
poz[heap[min]]=min;
poz[heap[k]]=k;
down(min);
}
}
void adauga(int a)
{vfheap++;vf++;
ele[vf]=a;
heap[vfheap]=vf;
poz[vf]=vfheap;
up(vfheap);
}
void sterge(int a)
{heap[poz[a]]=heap[vfheap];
poz[heap[vfheap]]=poz[a];
vfheap--;
up(poz[a]);
down(poz[a]);
poz[a]=0;
}
int main ()
{int i,a,b,n;
freopen("heap.in","r",stdin);
freopen("heap.out","w",stdout);
scanf("%d",&n);
for (i=1,vfheap=0,vf=0;i<=n;i++)
{scanf("%d",&a);
if(a==1)scanf("%d",&b),adauga(b);
else if(a==2) scanf("%d",&b),sterge(b);
else printf("%d\n",ele[heap[1]]);
}
return 0;
}