Pagini recente » Cod sursa (job #71213) | Cod sursa (job #2147207) | Cod sursa (job #3153976) | Cod sursa (job #2969392) | Cod sursa (job #1444394)
#include <stdio.h>
#include <vector>
using namespace std;
const int Max = 200005;
int H[Max],Pos[Max],Inx[Max],N,M;
void Insert_Node(int X)
{
while (X/2 && H[X/2]>H[X])
{
swap(Inx[X],Inx[X/2]);
Pos[Inx[X]] = X;
Pos[Inx[X/2]] = X/2;
swap(H[X],H[X/2]);
X /=2;
}
}
void Delete_Node(int index)
{
int Node = Pos[index];
swap(Inx[Node],Inx[M]);
Pos[index] = M;
Pos[Inx[Node]] = Node;
swap(H[Node],H[M]);
M--;
int Son;
do
{
Son = 0;
if (2*Node <= M) Son = 2*Node;
if (2*Node + 1 <= M && H[2*Node + 1]<H[Son])
Son = 2*Node + 1;
if (H[Node] <= H[Son]) Son = 0;
if (Son)
{
swap(Inx[Node],Inx[Son]);
Pos[Inx[Node]] = Node;
Pos[Inx[Son]] = Son;
swap(H[Node],H[Son]);
}
Node = Son;
}while (Son);
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&N);
int X;
char O;
for (int i = 1;i <= N;i++)
{
scanf("%d",&O);
if (O < 3) scanf("%d",&X);
switch (O)
{
case 1:
{
M++;
H[M] = X;
Inx[M] = i;
Pos[i] = M;
Insert_Node(M);
break;
}
case 2:
{
Delete_Node(X);
break;
}
case 3:{ printf("%d\n",H[1]);break;}
}
}
return 0;
}