堆的模板
(排序)
#include <algorithm>
#include <cstdio>
using namespace std;
#define LE(x) (x << 1)
#define RT(x) ((x << 1) | 1)
#define DAD(x) (x >> 1)
struct heap
{
int tot;
int w[5000005];
int top()
{
return w[1];
}
void modify(int x) //维护的是点(x)
{
if (x == 1)
return;
if (w[DAD(x)] < w[x])
{
swap(w[DAD(x)], w[x]);
modify(DAD(x));
}
};
void push(int x) //插入的是值(x)
{
w[++tot] = x;
modify(tot);
}
void repair(int x) //点
{
int tar = w[LE(x)] > w[RT(x)] ? LE(x) : RT(x);
if (w[x] < w[tar])
{
swap(w[x], w[tar]);
repair(tar);
}
}
void pop()
{
swap(w[tot], w[1]);
w[tot--] = 0;
repair(1);
}
};