#include <iostream>
using namespace std;
int N,m,A[5000005];
//用scanf,printf卡常
template <class T>
void sift(T a[],int k,int m){//换位,假设左右结点已排好序
int i=k;//根结点
int j=2*i;//左结点
T tmp;
while(j<=m){//当j是最后一个结点时
if(j<m&&a[j]>a[j+1]) j++;//如果右结点更小,转到右结点,注意越界
if(a[i]<a[j]) return;//如果a较小,不管
else{//否则交换父,子结点
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
i=j;//换到子节点,下一次判断
j=2*i;
}
}
}
template <class T>
void HeapSort(T a[],int n){
for(int i=n/2;i>=1;i--){
sift(a,i,n);//从后往前排序,i是起点,n是终点
}
T tmp;
for(int i=1;i<=m+1;++i){//一共只排m次
tmp=a[1];//交换根和最后结点
a[1]=a[n-i+1];
a[n-i+1]=tmp;
sift(a,1,n-i);//排序
}
printf("%d",a[n-m]);
}
int main() {
scanf("%d%d",&N,&m);
for(int i=1;i<=N;++i){
scanf("%d",&A[i]);
}
HeapSort(A,N);
return 0;
}
![]()