小根堆
int n;
int h[MAX_N];
inline void Insert(int x)
{
h[++n] = x;
int now = n;
while(now ^ 1)
{
if(h[now] >= h[now >> 1]) break;
swap(h[now], h[now >> 1]);
now >>= 1;
}
return;
}
inline void Delete()
{
if(!n) return;
swap(h[1], h[n--]);
int now = 1, next = 2;
while(next <= n)
{
if(next < n && h[next] > h[next | 1]) next |= 1;
if(h[now] <= h[next]) break;
swap(h[now], h[next]);
now = next;
next <<= 1;
}
return;
}
大根堆
int n;
int h[MAX_N];
inline void Insert(int x)
{
h[++n] = x;
int now = n;
while(now ^ 1)
{
if(h[now] <= h[now >> 1]) break;
swap(h[now], h[now >> 1]);
now >>= 1;
}
return;
}
inline void Delete()
{
swap(h[1], h[n--]);
int now = 1, next = 2;
while(next <= n)
{
if(next < n && h[next] < h[next | 1]) next |= 1;
if(h[now] >= h[next]) break;
swap(h[now], h[next]);
now = next;
next <<= 1;
}
return;
}