Pagini recente » Cod sursa (job #2867825) | Cod sursa (job #1869962) | Cod sursa (job #1673638) | Cod sursa (job #2863289) | Cod sursa (job #1042179)
/*
~Keep It Simple!~
*/
#include <stdio.h>
int heap[200001],positions[200001],revpos[200001],n,nr,nro;
void swap(int v[],int a,int b)
{
int aux = v[a];
v[a] = v[b];
v[b] = aux;
}
void Update(int node)
{
while( node/2 > 0 )
{
if( heap[node/2] > heap[node] )
{
swap(heap,node/2,node);
swap(positions,revpos[node/2],revpos[node]);
swap(revpos,node,node/2);
node/=2;
}
else
return;
}
}
void Add(int node,int value,int who)
{
heap[node] = value;
positions[who] = node;
revpos[node] = who;
Update(node);
}
void GoDown(int node)
{
int sw = 0;
while(node<=n)
{
if(2*node <= nr && heap[2*node] < heap[node] && heap[2*node] < heap[2*node+1] )
node = 2*node,sw=1;
else if( 2*node+1 <= nr && heap[2*node+1] < heap[node])
node = 2*node+1,sw=1;
if ( node/2 > 0 && sw == 1)
{
swap(heap,node/2,node);
swap(positions,revpos[node/2],revpos[node]);
swap(revpos,node,node/2);
sw = 0;
}
else
return;
}
}
void Remove(int node_position)
{
int node = positions[node_position];
heap[node] = -1;
Update(node);
heap[1] = heap[ nr-- ];
GoDown(1);
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&n);
int x,y;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
if( x == 3 )
printf("%d\n",heap[1]);
else if( x == 1 )
{
scanf("%d",&y);
Add(++nr,y,++nro);
}
else if( x == 2 )
{
scanf("%d",&y);
Remove(y);
}
}
}