Условие
В пространстве имён control реализуйте шаблон класса Range<T>. Закрытые поля нижней и верхней границ имеют тип T и задаются конструктором Range(T lower, T upper). Предусмотрите методы T get_lower() const, T get_upper() const, bool contains(T value) const и T clamp(T value) const. Последний метод ограничивает значение включительным диапазоном.
Прочитайте границы и запросы, создайте объект control::Range<int> или control::Range<double> в зависимости от указанного типа. Для каждого значения определите принадлежность диапазону и результат ограничения. Реализуйте один шаблон; отдельные копии класса для int и double не допускаются.
Ограничения
Время: 2 секунды. Память: 64 МиБ. Вывод: до 2 МиБ. Язык: C++17.
Входные данные
В первой строке вводится слово INT или DOUBLE. Во второй строке — lower upper. В третьей строке — Q, в четвёртой — Q значений. Ограничения: 1 ≤ Q ≤ 1000, все числа находятся в диапазоне от −10000 до 10000, lower ≤ upper. Для INT числа целые; для DOUBLE — вещественные с не более чем двумя знаками после десятичной точки.
Выходные данные
Выведите Q строк. Каждая содержит YES или NO — принадлежность исходного значения диапазону — и ограниченное значение через пробел. Для INT выводите целое число; для DOUBLE — число с шестью знаками после десятичной точки.
Примеры
INT 0 10 3 -1 5 11
NO 0 YES 5 NO 10
DOUBLE 0.5 1.5 3 0.5 1.25 2
YES 0.500000 YES 1.250000 NO 1.500000
INT 7 7 2 7 6
YES 7 NO 7