Условие
Объявите абстрактный класс AlarmRule с публичным виртуальным деструктором и чисто виртуальным методом bool is_alarm(int value) const. Создайте два производных класса: AboveThreshold, для которого тревога возникает при value ≥ threshold, и OutsideRange, для которого тревога возникает при value < lower или value > upper. Границы и порог задаются конструкторами и хранятся в закрытых полях. Переопределённые методы пометьте override.
Реализуйте функцию int count_alarms(const int values[], int count, const AlarmRule &rule). Она подсчитывает тревожные значения, вызывая виртуальный метод правила. Внутри функции не проверяйте конкретный тип правила.
В main прочитайте значения и настройки, создайте оба правила и вызовите одну и ту же функцию сначала для порогового правила, затем для диапазонного.
Ограничения
Время: 2 секунды. Память: 64 МиБ. Вывод: до 2 МиБ. Язык: C++17.
Входные данные
В первой строке вводится N, во второй — N целых значений. В третьей строке вводятся threshold lower upper. Ограничения: 1 ≤ N ≤ 1000, все значения и настройки находятся в диапазоне от −10000 до 10000, lower ≤ upper.
Выходные данные
Два целых числа через пробел — количество тревог для AboveThreshold и для OutsideRange соответственно.
Примеры
5 10 20 30 40 50 30 20 40
3 2
3 5 5 5 5 5 5
3 0
4 -10 0 10 20 100 -10 20
0 0