Pagini recente » Cod sursa (job #2475467) | Cod sursa (job #529449) | Cod sursa (job #759376) | Clasament eusebiu_oji_2017_cls11-12 | Cod sursa (job #1918907)
#include <iostream>
#include <fstream>
using namespace std;
#define MAX_NR 200000
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int N, NR;
int H[2 * MAX_NR + 10];
int P[MAX_NR], A[MAX_NR];
int left_son(int nod)
{
return 2 * nod;
}
int right_son(int nod)
{
return 2 * nod + 1;
}
int parent(int nod)
{
return nod / 2;
}
void sift(int K)
{
int son;
do
{
son = 0;
if(left_son(K) <= N)
{
son = left_son(K);
if(right_son(K) <= N && A[H[right_son(K)]] < A[H[son]])
son = right_son(K);
if(A[H[son]] > A[H[K]])
son = 0;
}
if(son == 0)
break;
swap(H[K], H[son]);
P[H[K]] = K;
P[H[son]] = son;
K = son;
}while(son);
}
void percolate(int K)
{
while(parent(K) > 0 && A[H[parent(K)]] > A[H[K]])
{
swap(H[K], H[parent(K)]);
P[H[K]] = K;
P[H[parent(K)]] = parent(K);
K = parent(K);
}
}
void insert(int value)
{
A[++NR] = value;
H[++N] = NR;
P[NR] = N;
percolate(N);
}
void cut(int K)
{
A[K] = -1;
percolate(P[K]);
P[H[1]] = 0;
H[1] = H[N--];
P[H[1]] = 1;
if(N > 1)
sift(1);
}
int main()
{
int m;
fin >> m;
for(int i = 0; i < m; i++)
{
int o, e;
fin >> o;
if(o == 3)
fout << A[H[1]] << '\n';
else
{
fin >> e;
if(o == 1)
insert(e);
else
cut(e);
}
}
return 0;
}