#include <stdio.h>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
// 初期設定
vector<int> v1 {5, 10, 3, 4};
bool b = is_heap(v1.begin(), v1.end());
printf("初期状態 v1:");
for (auto x : v1)
printf(" %d", x);
cout << boolalpha << " ヒープ化? : " << b << endl;
// v1 をヒープ化(make_heap)
printf("v1 をヒープ化(make_heap)\n");
make_heap(v1.begin(), v1.end());
b = is_heap(v1.begin(), v1.end());
printf(" make_heap v1:");
for (auto x : v1)
printf(" %d", x);
cout << " ヒープ化? : " << b << endl;
// 要素を追加してヒープ化
printf("要素を追加してヒープ化(push_heap)\n");
v1.push_back(7);
b = is_heap(v1.begin(), v1.end());
printf(" 7 を追加(push_back) v1:");
for (auto x : v1)
printf(" %d", x);
cout << " ヒープ化?(全体) : " << b << endl;
b = is_heap(v1.begin(), v1.end()-1);
cout << " ヒープ化?(最初の 4 個) : " << b << endl;
vector<int>::iterator it = is_heap_until(v1.begin(), v1.end());
printf(" ヒープ化されていない要素 : %d\n", *it);
push_heap(v1.begin(), v1.end());
b = is_heap(v1.begin(), v1.end());
printf(" 7 を追加(push_heap) v1:");
for (auto x : v1)
printf(" %d", x);
cout << " ヒープ化?(全体) : " << b << endl;
// 先頭と末尾を入れ替えてヒープ化(pop_heap)
printf("先頭と末尾を入れ替えてヒープ化(pop_heap)\n");
pop_heap(v1.begin(), v1.end());
printf(" 先頭と末尾を入れ替えてヒープ化(pop_heap) v1:");
for (auto x : v1)
printf(" %d", x);
b = is_heap(v1.begin(), v1.end());
cout << " ヒープ化?(全体) : " << b << endl;
b = is_heap(v1.begin(), v1.end()-1);
cout << " ヒープ化?(最初の 4 個) : " << b << endl;
v1.pop_back();
printf(" 最後の要素を削除(pop_back) v1:");
for (auto x : v1)
printf(" %d", x);
b = is_heap(v1.begin(), v1.end());
cout << " ヒープ化?(全体) : " << b << endl;
// ヒープ化した範囲を並べ替える(sort)
printf("ヒープ化した範囲を並べ替える(sort_heap)\n");
sort_heap(v1.begin(), v1.end());
printf(" sort_heap v1:");
for (auto x : v1)
printf(" %d", x);
b = is_heap(v1.begin(), v1.end());
cout << " ヒープ化?(全体) : " << b << endl;
return 0;
}