#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; }