Pagini recente » Cod sursa (job #2238960) | Cod sursa (job #2423129) | Cod sursa (job #17948) | Cod sursa (job #2227432) | Cod sursa (job #330420)
Cod sursa(job #330420)
#include<stdio.h>
#define Nmx 200010
int n,nr,L;
int Heap[Nmx],pz[Nmx],A[Nmx];
void push(int k)
{
int t;
while(k>1&&A[Heap[k/2]]>A[Heap[k]])
{
t=Heap[k];
Heap[k]=Heap[k/2];
Heap[k/2]=t;
pz[Heap[k]]=k;
pz[Heap[k/2]]=k/2;
k=k/2;
}
}
void scot(int k)
{
while((k*2<=n&&A[Heap[k*2]]<A[Heap[k]])||
(k*2+1<=n&&A[Heap[k*2+1]]<A[Heap[k]]))
{
if(k*2+1<=n)
{
if(A[Heap[k*2]]<A[Heap[k*2+1]])
{
int t=Heap[k];
Heap[k]=Heap[k*2];
Heap[k*2]=t;
pz[Heap[k]]=k;
pz[Heap[k*2]]=k*2;
k=k*2;
}
else{
int t=Heap[k];
Heap[k]=Heap[k*2+1];
Heap[k*2+1]=t;
pz[Heap[k]]=k;
pz[Heap[k*2+1]]=k*2+1;
k=k*2+1;
}
}
else {
int t=Heap[k];
Heap[k]=Heap[k*2];
Heap[k*2]=t;
pz[Heap[k]]=k;
pz[Heap[k*2]]=k*2;
k=k*2;
}
}
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&nr);
int tip,x;
for(int i=1;i<=nr;++i)
{
scanf("%d",&tip);
if(tip==3)
printf("%d\n",A[Heap[1]]);
else
{
scanf("%d",&x);
if(tip==1)
{
n++;L++;
A[L]=x;
Heap[n]=L;
pz[L]=n;
push(n);
}
else {
Heap[pz[x]]=Heap[n];
pz[Heap[n]]=pz[x];
Heap[n--]=0;
int k=pz[x];
pz[x]=0;
if(k>1&&A[Heap[k]]<A[Heap[k/2]])
push(k);
else if((k*2<=n&&A[Heap[k*2]]<A[Heap[k]])||
(k*2+1<=n&&A[Heap[k*2+1]]<A[Heap[k]]))
scot(k);
}
}
}
return 0;
}