Pagini recente » Cod sursa (job #1901385) | Cod sursa (job #1203107)
#include <cstdio>
#define MAX 200001
using namespace std;
int n,heap[MAX],nrheap,rand[MAX],urm;
void schimba(int poz1,int poz2);
void mareste(int x);
void scoate(int poz);
void coboara(int poz);
void urca(int poz);
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int i,op,x;
scanf("%d",&n);
for(i=1;i<=n;++i)
{
scanf("%d",&op);
if(op==1)
{
scanf("%d",&x);
urm++;
mareste(x);
}
if(op==2)
{
scanf("%d",&x);
scoate(x);
}
if(op==3)
printf("%d\n",heap[1]);
}
return 0;
}
void schimba(int poz1,int poz2)
{
int cop;
cop=heap[poz1],heap[poz1]=heap[poz2],heap[poz2]=cop;
cop=rand[poz1],rand[poz1]=rand[poz2],rand[poz2]=cop;
}
void mareste(int x)
{
nrheap++;
heap[nrheap]=x;
rand[nrheap]=urm;
urca(nrheap);
}
void scoate(int poz)
{
for(int i=1;i<=nrheap;++i)
if(rand[i]==poz)
{
poz=i;
break;
}
schimba(poz,nrheap);
nrheap--;
coboara(poz);
}
void coboara(int poz)
{
if(poz*2>nrheap)
return;
else
{
int ok=0;
if(poz*2+1<=nrheap)
if(heap[poz*2+1]<heap[poz*2])
ok=1;
if(ok==0)
schimba(poz,poz*2),coboara(poz*2);
else
schimba(poz,poz*2+1),coboara(poz*2+1);
}
}
void urca(int poz)
{
if(poz/2<1)
return;
else
if(heap[poz]<heap[poz/2])
schimba(poz,poz/2),urca(poz/2);
}