Pagini recente » Cod sursa (job #2744084) | Cod sursa (job #218872) | Cod sursa (job #2940271) | Cod sursa (job #2796175) | Cod sursa (job #1146707)
#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,j;
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)
{
j=P[x];
F=j;
T=F/2;
H[j]=H[l--];
up();
T=j;
down();
}
}
return 0;
}