#include <iostream>
#include <vector>
#include <set>

using namespace std;

typedef multiset<int, greater<int> > IntHeap;

void findLeastKNumbers(const vector<int>& data, IntHeap& leastKNumbers, unsigned int k) {
  leastKNumbers.clear();

  if(data.empty() || k==0)
    return;

  if(k > data.size()) {
    for(vector<int>::const_iterator iter = data.begin(); iter != data.end(); iter++)
      leastKNumbers.insert(*iter);
    return;
  }

  for(vector<int>::const_iterator dataIter = data.begin(); dataIter != data.end(); dataIter++) {
    if(leastKNumbers.size() < k) {
      leastKNumbers.insert(*dataIter);
    } else {
      IntHeap::iterator iterFirst = leastKNumbers.begin();

      if(*dataIter > *iterFirst) {
	leastKNumbers.erase(*iterFirst);
	leastKNumbers.insert(*dataIter);
      }
    }
  }
}

int main(int argc, char **argv) {

  vector<int> data;
  for(int i=0; i<20; i++) {
    data.push_back(i*2);
  }

  //  for(int 

  IntHeap heap;
  findLeastKNumbers(data, heap, 5);

  for(IntHeap::iterator iter = heap.begin(); iter != heap.end(); iter++)
    cout << *iter << " ";
  cout << endl;


  return 0;
}
