Pagini recente » Cod sursa (job #611163) | Cod sursa (job #926907) | Cod sursa (job #578997) | Cod sursa (job #912412) | Cod sursa (job #1256091)
#include<cstdio>
using namespace std;
int heap[200002],v[200002],poz[200002],n,k;
int fiudr(int a)
{
return (a*2)+2;
}
int fiust(int a)
{
return (a*2)+1;
}
int tata(int a)
{
return (a-1)/2;
}
void schimb(int p1,int p2)
{
int aux;
poz[heap[p1]]=p2;
poz[heap[p2]]=p1;
aux=heap[p1];
heap[p1]=heap[p2];
heap[p2]=aux;
}
void urcare(int p)
{
while((p!=0)&&(v[heap[p]]<v[heap[tata(p)]]))
{
schimb(p,tata(p));
p=tata(p);
}
}
void coborare(int p)
{
int f,q;
f=1;
while((f==1)&&(fiust(p)<n))
{
q=fiust(p);
if((fiudr(p)<n)&&(v[heap[fiudr(p)]]<v[heap[q]]))
{
q=fiudr(p);
}
if(v[heap[q]]<v[heap[p]])
{
schimb(p,q);
p=q;
}
else
{
f=0;
}
}
}
void sterge()
{
int p;
scanf("%d",&p);
p--;
n--;
heap[poz[p]]=heap[n];
poz[heap[n]]=poz[p];
if((poz[p]!=0)&&(v[heap[poz[p]]]<v[heap[tata(poz[p])]]))
{
urcare(poz[p]);
}
else
{
coborare(poz[p]);
}
}
void adauga()
{
scanf("%d",&v[k]);
heap[n]=k;
poz[k]=n;
k++;
n++;
urcare(poz[k]);
}
void minim()
{
printf("%d\n",v[heap[0]]);
}
void pre(int c)
{
if(c==1)
{
adauga();
}
else
if(c==2)
{
sterge();
}
else
minim();
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int i,c,nr;
scanf("%d",&nr);
for(i=1;i<=nr;i++)
{
scanf("%d",&c);
pre(c);
}
return 0;
}