Pagini recente » Cod sursa (job #1763067) | Cod sursa (job #1763066) | Cod sursa (job #1272876) | Cod sursa (job #993556) | Cod sursa (job #333048)
Cod sursa(job #333048)
#include<cstdio>
using namespace std;
int a[200001],heapsize,n,x,y,cron[200001],gasit,cr;
int left(int i)
{return 2*i;}
int right (int i)
{return 2*i+1;}
int tata(int i)
{return i/2;}
void minHeapify(int i)
{if(i<heapsize && heapsize>1)
{int minim,l,r;
l=left(i);
r=right(i);
if(l<=heapsize){
if(a[i]>a[r] && r<=heapsize) minim=r;
else minim=i;
if(a[minim]>a[l]) minim=l;
if(i!=minim) {int aux;aux=a[i];a[i]=a[minim];a[minim]=aux;minHeapify(minim);}}}}
void insert(int val)
{heapsize++;
a[heapsize]=val;
if(heapsize>1){
int i=heapsize;
while(i>1 && a[i]<a[tata(i)])
{int aux;aux=a[i];a[i]=a[tata(i)];a[tata(i)]=aux;
i=tata(i);} }
/* for(int k=1;k<=heapsize;k++) printf("%d ", a[k]);
printf("\n"); */
}
int minim()
{return a[1];}
void cautareHeap(int in,int sf,int val,int &gasit,int &poz)
{if(in<sf)
{int mij=in+((sf-in)/2);
if(a[mij]==val) {gasit=1;poz=mij;return;}
else {cautareHeap(in,mij,val,gasit,poz);
cautareHeap(mij+1,sf,val,gasit,poz);}
}
}
void deleteHeap(int x)
{int val=cron[x];
gasit=0;
int poz=1;cautareHeap(1,heapsize,val,gasit,poz);
for(int j=x;j<cr;j++)
cron[j]=cron[j+1];
cr--;
int aux1=a[poz];a[poz]=a[heapsize];a[heapsize]=aux1;heapsize--;
//printf("%d ", a[poz]);
minHeapify(poz);
/*for(int k=1;k<=heapsize+1;k++) printf("%d ", a[k]);
printf("\n"); */
}
int main()
{freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int m,val;heapsize=0;cr=0;
scanf("%d",&m);
for(;m;m--)
{scanf("%d",&x);
if(x==1) {scanf("%d",&val); cr++;cron[cr]=val;insert(val);}
else if(x==2) {scanf("%d",&x);deleteHeap(x);}
else printf("%d \n",a[1]);
}
return 0;
}