Pagini recente » Cod sursa (job #2215041) | Cod sursa (job #3167400) | Cod sursa (job #171675) | Cod sursa (job #844524) | Cod sursa (job #1097551)
#include <fstream>
#define NMAX 200005
using namespace std;
FILE* f=freopen("heapuri.in","r",stdin);
FILE* o=freopen("heapuri.out","w",stdout);
int n;
int heap[NMAX],l;
int posOfInd[NMAX];
int indOfPos[NMAX];
void Swap(int a, int b)
{
swap(heap[a],heap[b]);
swap(indOfPos[a],indOfPos[b]);
swap(posOfInd[indOfPos[a]],posOfInd[indOfPos[b]]);
}
void Shift(int p)
{
int c=p*2;
while(c<=l)
{
if(c<l&&heap[c]>heap[c+1]) c+=1;
if(heap[p]>heap[c])
{
Swap(p,c);
p=c;
c=p*2;
}
else break;
}
}
void Push(int c)
{
int p=c/2;
while(p)
{
if(heap[p]>heap[c])
{
Swap(p,c);
c=p;
p=c/2;
}
else break;
}
}
void Insert(int elem, int pos)
{
heap[++l]=elem;
posOfInd[pos]=l;
indOfPos[l]=pos;
Push(l);
}
void Remove(int pos)
{
int aux=posOfInd[pos];
Swap(posOfInd[pos],l);
l-=1;
Shift(aux);
}
int main()
{
int k,x,ind=0;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&k);
switch(k)
{
case 1:
scanf("%d",&x);
Insert(x,++ind);
break;
case 2:
scanf("%d",&x);
Remove(x);
break;
case 3:
printf("%d\n",heap[1]);
break;
}
}
return 0;
}