Pagini recente » Cod sursa (job #2511194) | Cod sursa (job #33787) | Cod sursa (job #715007) | Cod sursa (job #2821599) | Cod sursa (job #920306)
Cod sursa(job #920306)
#include <cstdio>
using namespace std;
long aux,heap[200000],ini[200000],poz[200000],n,i,c,t,k,val,j;
void ridica(int i)
{
if(heap[i/2]>heap[i]){
aux=heap[i];heap[i]=heap[i/2];heap[i/2]=aux;
aux=ini[i];ini[i]=ini[i/2];ini[i/2]=aux;
aux=poz[ini[i]];poz[ini[i]]=poz[ini[i/2]];poz[ini[i/2]]=aux;
ridica(i/2);
}
}
int main()
{
freopen("heap.in","r",stdin);
freopen("heap.out","w",stdout);
scanf("%ld",&n);heap[0]=0;
for(i=1;i<=n;i++){
scanf("%ld",&c);
if(c==3){printf("%ld ",heap[1]);}
if(c==1){t++;k++;scanf("%ld",&val);ini[t]=k;heap[t]=val;poz[k]=t;ridica(t);}
if(c==2){
t++;k++;scanf("%ld",&val);j=poz[val];ini[j]=0;poz[val]=0;heap[j]=1000000001;
while(((heap[j]>heap[2*j])||(heap[j]>heap[2*j+1]))&&((heap[2*j])||(heap[2*j+1]))){
if((heap[2*j]<heap[2*j+1])||(!heap[2*j+1])){
aux=heap[j];heap[j]=heap[j*2];heap[j*2]=aux;
aux=ini[j];ini[j]=ini[j*2];ini[j*2]=aux;
aux=poz[ini[j]];poz[ini[j]]=poz[ini[j*2]];poz[ini[j*2]]=aux;j=j*2;
}
else{
if(heap[2*j+1]){
aux=heap[j];heap[j]=heap[j*2+1];heap[j*2+1]=aux;
aux=ini[j];ini[j]=ini[j*2+1];ini[j*2+1]=aux;
aux=poz[ini[j]];poz[ini[j]]=poz[ini[j*2+1]];poz[ini[j*2+1]]=aux;j=j*2+1;
}
}
}
}
}
return 0;
}