Pagini recente » Cod sursa (job #472614) | Cod sursa (job #2676464) | Cod sursa (job #2499824) | Cod sursa (job #1534136) | Cod sursa (job #1146692)
#include <cstdio>
# define N 200010
#include <vector>
#define val first
#define poz second
using namespace std;
pair<int,int> H[N];
int x,F,T,P[N],left,l,t,i,op,p;
void up()
{
//val=H[F].val;
while(T&&H[F].val<H[T].val)
{
swap(H[F],H[T]);
P[H[F].poz]=F;
P[H[T].poz]=T;
T/=2;
F/=2;
}
}
void down()
{
while(1)
{
F=T*2;
if(F>l)
break;
if(F<=l)
{
if(F+1<=l&&H[F+1].val<H[F].val)
F++;
if(H[F].val>=H[T].val)break;;
swap(H[F],H[T]);
P[H[F].poz]=F;
P[H[T].poz]=T;
T=F;
}
}
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&t);
for(i=1;i<=t;i++)
{
scanf("%d",&op);
if(op==3)
{
printf("%d\n",H[1].val);
continue;
}
scanf("%d",&x);
if(op==1)
{
H[++l].val=x;
H[l].poz=++p;
P[i]=l;
F=l;
T=F/2;
up();
continue;
}
if(op==2)
{
F=P[x];
T=F/2;
H[F]=H[l--];
if(F>1&&H[F]<H[T])
up();
else
{
T=F;
down();
}
}
}
return 0;
}