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

using namespace std;

void comboRec(const vector<int> & A, int k, int i, vector<bool> & cur)
{
  if (!k)
  {
    for (int j = 0; j < A.size(); j++)
      if (cur[j]) cout << A[j] << ' ';
    cout << endl;
    return;
  }
  if (k == A.size() - i)
  {
    for (int j = 0; j < i; j++)
      if (cur[j]) cout << A[j] << ' ';
    for (int j = i; j < A.size(); j++)
      cout << A[j] << ' ';
    cout << endl;
    return;
  }
  cur[i] = false;
  comboRec(A, k, i + 1, cur);
  cur[i] = true;
  comboRec(A, k - 1, i + 1, cur);
  cur[i] = false;
  return;
}

void comboRecSet(set<int> & remaining, int k, set<int> & used)
{
  if (!k)
  {
    for (int i:used)
      cout << i << ' ';
    cout << endl;
    return;
  }
  if (k == remaining.size())
  {
    for (int i:used)
      cout << i << ' ';
    for (int i:remaining)
      cout << i << ' ';
    cout << endl;
    return;
  }
  set<int>::iterator i = remaining.begin();
  int j = *i;
  remaining.erase(i);
  comboRecSet(remaining, k, used);
  used.insert(j);
  comboRecSet(remaining, k - 1, used);
  used.erase(j);
  remaining.insert(j);
  return;
}

void combo(const vector<int> & A, int k)
{
  vector<bool> cur(A.size(), false);
  // comboRec(A, k, 0, cur);
  set<int> remaining, used;
  for (int i : A)
    remaining.insert(i);
  comboRecSet(remaining, k, used);
  return;
}

int main()
{
  combo({1, 2, 3, 4, 5}, 2);
  return 0;
}
