//#include //#include //#include #include #define INF 2000000000 using namespace std; int Max[15],Min[15]; void init() { memset(Max,0,sizeof(Max));//fill(high, high+15, 0); memset(Min,0x3f,sizeof(Min));//fill(low, low+15, INF); } void Sink1(int r[],int k,int n)//下沉操作,小顶堆 { while(2*k<=n)//如果有左孩子 { int j=2*k;//j指向左孩子 if(jr[j+1])//如果有右孩子且左孩子比右孩子小 j++; //j指向右孩子 if(r[k]<=r[j])//比较大的孩子大 break; //已满足堆 else swap(r[k],r[j]);//与较大的孩子交换 k=j;//k指向交换后的新位置,继续向下比较,一直下沉到叶子 } } void Sink2(int r[],int k,int n)//下沉操作,小顶堆 { while(2*k<=n)//如果有左孩子 { int j=2*k;//j指向左孩子 if(j=r[j])//比较大的孩子大 break; //已满足堆 else swap(r[k],r[j]);//与较大的孩子交换 k=j;//k指向交换后的新位置,继续向下比较,一直下沉到叶子 } } void CreatHeap(int r[],int n,int flag)//构建初始堆 { for(int i=n/2;i>0;i--)//从最后一个分支结点n/2开始调整为堆,直到第一个结点 if(flag) Sink1(r,i,n);//小顶堆 else Sink2(r,i,n);//大顶堆 } int main() { int n,great,least; while(scanf("%d%d%d",&great,&least,&n), great&&least&&n) { long long sum=0; int x; init(); for(int i=1;i<=n;i++) { scanf("%d", &x); sum+=x; //这里是小顶堆,堆顶最小,如果x比最小的数要大,用x替换堆顶,再维护小顶堆 if(i<=great) Max[i]=x; if(i==great) CreatHeap(Max,great,1);//构建初始小顶堆 if(i>great&&x>Max[1])//小顶堆维护great个最大值 { Max[1]=x; Sink1(Max,1,great); } if(i<=least) Min[i]=x; if(i==least) CreatHeap(Min,least,0);//构建初始大顶堆 if(i>least&&x