#include<iostream>
using namespace std;
using namespace std;
const int maxn = 10010;
#define PARENT(i) i/2
#define LEFT(i) i<<1
#define RIGHT(i) (i<<1)+1
int heap[maxn];
int hsize = 0;
int n;
void MAXHEAPIFY(int *A, int key)
{
int l = LEFT(key);
int r = RIGHT(key);
int largest = 0;
if (l <= hsize&&A[key] < A[l])
{
largest = l;
}
else largest = key;
if (r <= hsize&&A[largest] < A[r])
largest = r;
if (largest != key)
{
int temp = A[key];
A[key] = A[largest];
A[largest] = temp;
MAXHEAPIFY(A, largest);
}
}
void BUILDMAXHEAP(int *A)
{
for (int i = hsize / 2; i >= 1; i--)
MAXHEAPIFY(A, i);
}
void HEAPSORT(int *A)
{
for (int i = n; i > 1; i--)
{
int temp = heap[1];
heap[1] = heap[i];
heap[i] = temp;
hsize--;
MAXHEAPIFY(A, 1);
}
}
int HEAP_MAXIMUM(int *A)
{
return A[1];
}
int HEAP_EXTRACT_MAX(int *A)
{
if (hsize < 1)cout << "error";
int max = A[1];
A[1] = heap[hsize];
hsize--;
MAXHEAPIFY(A, 1);
return max;
}
bool HEAP_INCREACSE_KEY(int *A, int i, int key) {
if (key < A[i])return false;
A[i] = key;
while (i > 1 && A[PARENT(i)] < A[i])
{
int temp = A[PARENT(i)];
A[PARENT(i)] = A[i];
A[i] = temp;
i = PARENT(i);
}
}
bool HEAP_INSERT(int *A, int key)
{
hsize++;
A[hsize] = INT_MIN;
HEAP_INCREACSE_KEY(A, hsize,key);
return true;
}
int main()
{
freopen("in.txt", "r", stdin);
cin >> n;
hsize = n;
for (int i = 1; i <= n; i++)
cin >> heap[i];
BUILDMAXHEAP(heap);
//HEAPSORT(heap);
for (int i = 1; i <= n; i++)
cout << heap[i] << " ";
cout << endl;
cout << HEAP_EXTRACT_MAX(heap) << endl;
HEAP_INSERT(heap, 10);
for (int i = 1; i <= n; i++)
cout << heap[i] << " ";
return 0;
}
using namespace std;
using namespace std;
const int maxn = 10010;
#define PARENT(i) i/2
#define LEFT(i) i<<1
#define RIGHT(i) (i<<1)+1
int heap[maxn];
int hsize = 0;
int n;
void MAXHEAPIFY(int *A, int key)
{
int l = LEFT(key);
int r = RIGHT(key);
int largest = 0;
if (l <= hsize&&A[key] < A[l])
{
largest = l;
}
else largest = key;
if (r <= hsize&&A[largest] < A[r])
largest = r;
if (largest != key)
{
int temp = A[key];
A[key] = A[largest];
A[largest] = temp;
MAXHEAPIFY(A, largest);
}
}
void BUILDMAXHEAP(int *A)
{
for (int i = hsize / 2; i >= 1; i--)
MAXHEAPIFY(A, i);
}
void HEAPSORT(int *A)
{
for (int i = n; i > 1; i--)
{
int temp = heap[1];
heap[1] = heap[i];
heap[i] = temp;
hsize--;
MAXHEAPIFY(A, 1);
}
}
int HEAP_MAXIMUM(int *A)
{
return A[1];
}
int HEAP_EXTRACT_MAX(int *A)
{
if (hsize < 1)cout << "error";
int max = A[1];
A[1] = heap[hsize];
hsize--;
MAXHEAPIFY(A, 1);
return max;
}
bool HEAP_INCREACSE_KEY(int *A, int i, int key) {
if (key < A[i])return false;
A[i] = key;
while (i > 1 && A[PARENT(i)] < A[i])
{
int temp = A[PARENT(i)];
A[PARENT(i)] = A[i];
A[i] = temp;
i = PARENT(i);
}
}
bool HEAP_INSERT(int *A, int key)
{
hsize++;
A[hsize] = INT_MIN;
HEAP_INCREACSE_KEY(A, hsize,key);
return true;
}
int main()
{
freopen("in.txt", "r", stdin);
cin >> n;
hsize = n;
for (int i = 1; i <= n; i++)
cin >> heap[i];
BUILDMAXHEAP(heap);
//HEAPSORT(heap);
for (int i = 1; i <= n; i++)
cout << heap[i] << " ";
cout << endl;
cout << HEAP_EXTRACT_MAX(heap) << endl;
HEAP_INSERT(heap, 10);
for (int i = 1; i <= n; i++)
cout << heap[i] << " ";
return 0;
}