Pagini recente » Cod sursa (job #1397310) | Cod sursa (job #1053811) | Cod sursa (job #2379358) | Cod sursa (job #1072086) | Cod sursa (job #1112227)
#include <cstdio>
using namespace std;
int minim(int a,int b)
{
if(a==0)
return b;
if(b==0)
return a;
if(a<b)
return a;
return b;
}
int val[200009],heap[200009],poz[200009];
int main()
{
int n,i,op,nr,x,aux,j,m,fiu,numar;
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&n);
nr=0;
numar=0;
for(j=1;j<=n;j++)
{
scanf("%d",&op);
if(op==1)
{
scanf("%d",&x);
nr++;
numar++;
poz[numar]=nr;
val[numar]=x;
heap[nr]=numar;
i=nr;
while(val[heap[i/2]]>val[heap[i]]&&i>1)
{
aux=heap[i/2];
heap[i/2]=heap[i];
heap[i]=aux;
poz[heap[i]]=i;
poz[heap[i/2]]=i/2;
i=i/2;
}
}
if(op==2)
{
scanf("%d",&x);
heap[poz[x]]=heap[nr];
heap[nr]=0;
poz[heap[poz[x]]]=poz[x];
i=poz[x];
poz[x]=0;
nr--;
while(val[heap[i]]<val[heap[i/2]]&&i>1&&i<nr)
{
aux=heap[i];
heap[i]=heap[i/2];
heap[i/2]=aux;
poz[heap[i]]=i;
poz[heap[i/2]]=i/2;
i=i/2;
}
m=minim(val[heap[2*i]],val[heap[2*i+1]]);
if(m==val[heap[2*i]]&&2*i<=nr)
fiu=2*i;
else
{
if(2*i+1<=nr)
fiu=2*i+1;
else
fiu=2*i;
}
while(val[heap[i]]>m&&nr/2>=i)
{
aux=heap[i];
heap[i]=heap[fiu];
heap[fiu]=aux;
poz[heap[i]]=i;
poz[heap[fiu]]=fiu;
i=fiu;
m=minim(val[heap[2*i]],val[heap[2*i+1]]);
if(m==val[heap[2*i]]&&2*i<=nr)
fiu=2*i;
else
{
if(2*i+1<=nr)
fiu=2*i+1;
else
fiu=2*i;
}
}
}
if(op==3)
printf("%d\n",val[heap[1]]);
}
return 0;
}