随手翻到了去年写的手写堆- -手写堆真是太蠢了
Lheap:小根堆
Rheap:大根堆
#include<algorithm>
#include<cstring>
#include<cstdio>
#define N 900020
using namespace std;
inline int max(int a,int b){return a>b?a:b;}
inline int min(int a,int b){return a<b?a:b;}
inline void swap(int& a,int& b){int c=a;a=b;b=c;}
struct Lheap{
int Top;
int a[N];
Lheap(){Top=0;memset(a,0x7f7f7f7f,sizeof a);}
inline bool empty(){
if(!Top) return true;
return false;
}
inline int size(){ return Top;}
inline int top(){ return a[1];}
inline void heap_down(int k){
int t=0;
while(k*2<=Top){
if(k*2+1<=Top)
if(a[k*2]<a[k*2+1])
t=k*2;
else t=k*2+1;
else t=k*2;
if(a[t]<a[k]){
swap(a[t],a[k]);
k=t;
}
else break;
}
}
inline void heap_up(int k){
int t;
while(k>1){
if(k&1) t=(k-1)>>1;
else t=k>>1;
if(a[k]<a[t]){
swap(a[k],a[t]);
k=t;
}
else break;
}
}
inline void pop(){
swap(a[1],a[Top]);
Top--;
heap_down(1);
}
inline void push(int k){
a[++Top]=k;
heap_up(Top);
}
}q1;
struct Bheap{
int Top;
int a[N];
Bheap(){
Top=0;memset(a,-1,sizeof a);
}
inline bool empty(){
if(!Top) return true;
return false;
}
inline int size(){ return Top;}
inline int top(){ return a[1];}
inline void heap_down(int k){
int t=0;
while(k*2<=Top){
if(k*2+1<=Top)
if(a[k*2]>a[k*2+1])
t=k*2;
else t=k*2+1;
else t=k*2;
if(a[t]>a[k]){
swap(a[t],a[k]);
k=t;
}
else break;
}
}
inline void heap_up(int k){
int t;
while(k>1){
if(k&1) t=(k-1)>>1;
else t=k>>1;
if(a[k]>a[t]){
swap(a[k],a[t]);
k=t;
}
else break;
}
}
inline void pop(){
swap(a[1],a[Top]);
Top--;
heap_down(1);
}
inline void push(int k){
a[++Top]=k;
heap_up(Top);
}
}q2;
int main(){
int a,b;
scanf("%d%d",&a,&b);
q1.push(a);q1.push(b);
q2.push(a);q2.push(b);
printf("%d %d",q1.top(),q2.top());
q1.pop();q2.pop();
return 0;
}