3.1 Динамическая память

3.1.2 Копия допустимых значений

Условие

Дан массив из 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, а вторая должна быть пустой.

Примеры

Вход 1
6
-2 0 3 3 8 5
0 5
Ожидаемый выход
4
0 3 3 5
Вход 2
3
1 2 3
4 5
Ожидаемый выход
0

Вход 3
3
2 2 1
2 2
Ожидаемый выход
2
2 2

Пробный запуск

Код берётся из редактора. Запуск не создаёт посылку и не влияет на баллы.

Выберите пример или введите свои данные и нажмите «Запустить».

Текущая попытка

Отправьте решение. Этапы и результат появятся здесь автоматически.

Все попытки

Войдите, чтобы видеть свои попытки.

Редактор

Один файл до 64 КиБ · Tab / Shift+Tab — отступ · Esc — выход из редактора · черновик сохраняется для этого аккаунта, задачи и языка.