Условие
Дан массив из N целых чисел и границы допустимого диапазона lower и upper. Создайте отдельный динамический массив, содержащий только значения из этого диапазона включительно. Сохраните порядок элементов и все повторяющиеся допустимые значения. Исходный массив не должен изменяться.
Реализуйте функцию int *filter_values(const int source[], int count, int lower, int upper, int *result_count). Она сначала определяет количество подходящих элементов, затем выделяет память ровно для этого количества элементов, заполняет новый массив и возвращает указатель на него. Размер результата запишите через result_count, который указывает на существующую переменную типа int.
Если подходящих элементов нет, не вызывайте malloc: запишите в *result_count значение 0 и верните нулевой указатель. Если выделение памяти для непустого результата завершилось неудачно, запишите в *result_count значение −1 и верните нулевой указатель. Так вызывающий код сможет отличить пустой результат от ошибки выделения. Функция не должна выполнять ввод или вывод и не должна освобождать исходный массив.
В main динамически выделите исходный массив, прочитайте данные и вызовите filter_values. Выведите результат, затем освободите оба массива. Освобождение возвращённого массива является обязанностью вызывающего кода. При ошибке выделения соблюдайте общее правило блока.
Ограничения
Время: 2 секунды. Память: 64 МиБ. Вывод: до 2 МиБ. Стандарты: C11 / C++17.
Входные данные
В первой строке вводится целое число N. Во второй строке вводятся N целых чисел через пробел. В третьей строке вводятся два целых числа lower и upper. Ограничения: 1 ≤ N ≤ 100000, −10⁶ ≤ aᵢ, lower, upper ≤ 10⁶, lower ≤ upper.
Выходные данные
В первой строке выведите количество допустимых элементов. Во второй строке выведите эти элементы через пробел. Если допустимых элементов нет, первая строка должна содержать 0, а вторая должна быть пустой.
Примеры
6 -2 0 3 3 8 5 0 5
4 0 3 3 5
3 1 2 3 4 5
0
3 2 2 1 2 2
2 2 2