Pagini recente » Cod sursa (job #1559952) | Cod sursa (job #1663325) | Cod sursa (job #261506) | Cod sursa (job #723066) | Cod sursa (job #240525)
Cod sursa(job #240525)
#include <stdio.h>
#include <algorithm>
using namespace std;
long n,i,t,x,q,k,h[200000],nr[200000],poz[200000];
void down(long i){
long fiu;
while ((long)(i<<1)<=q){
fiu=i<<1;
if ((long)(fiu|1)<=q)
if (h[fiu|1]<h[fiu])fiu|=1;
if (h[fiu]<h[i]){
swap(h[i],h[fiu]);
swap(nr[i],nr[fiu]);
poz[nr[i]]=i;
poz[nr[fiu]]=fiu;
i=fiu;
}
else break;
}
}
void up(long i){
long val=h[i],valnr=nr[i];
while (i>1 && val<h[i>>1]){
h[i]=h[i>>1];
nr[i]=nr[i>>1];
poz[nr[i]]=i;
i>>=1;
}
h[i]=val;
nr[i]=valnr;
poz[nr[i]]=i;
}
int main(){
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%ld",&n);
for (i=1;i<=n;++i){
scanf("%ld",&t);
if (t==3)printf("%ld\n",h[1]);
else if (t==1){scanf("%ld",&x);h[++q]=x;nr[q]=++k;poz[k]=q;up(q);}
else {scanf("%ld",&x);h[poz[x]]=h[q];q--;down(poz[x]);}
}
return 0;
}