#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

const int N = 10;

int a[N] = {1, 3, 2};
vector<int> b = {2, 1, 3};

// функция-компаратор, мы его передадим сортировке
bool f( int i, int j ) {
	return i > j;
}

// функтор-компратор
struct comparator {
	int x;
	bool operator() ( int i, int j ) {
		return i * x < j * x;
	}
};

void out() {
	for (int i = 0; i < N; i++) printf("%d%c", a[i], " \n"[i == N - 1]);
}

int main() {
	sort(b.begin(), b.end()); // сортируем вектор
	sort(a, a + N); // сортируем массив
	sort(a, a + N, f); // передаём свою функцию сравнения
	out();
	sort(a, a + N, comparator {1}); // другой способ передавать функцию
	out();
	sort(a, a + N, comparator {-1}); // а теперь понятно, чем он удобнее
	out();

	int i = lower_bound(b.begin(), b.end(), 3) - b.begin(); // min i : a[i] >= 3
	int j = upper_bound(a, a + N, 3, f) - a; // min i : a[i] <= 3, т.к. у нас свой компаратор
	auto it = lower_bound(b.begin(), b.end(), 3); // на самом деле нам вернули итератор (указатель на элемент)
	while (it != b.end() && *it <= 5) // вывели все элементы до 5
		printf("%d ", *it++);
}