Комментарии 2
По-моему, у вас алгоритм сломается, если два правила пересекаются, или два исключения. Алгоритм не знает, сколько исключений активно в данный момент, поэтому выключит флаг, когда встретит конец первого исключения, несмотря на то, что второе ещё в силе.
Такое может легко случиться на практике, например, если у врача больничный пересекается с выходными, или государственные праздники.
TL;DR
Что-то вы наворотили.
Если сложить границы всех интервалов в упорядоченный контейнер (массив или дерево), то в четных позициях будут начала интервалов, а в нечетных концы.
Затем достаточно искать begin/end вычитаемых или включаемых интервалов и реализовать логику включения/исключения с удалением из контейнера "закрашиваемых" границ.
Либо просто задействовать boost::icl::interval_set
;)
Как вычитать серии временных промежутков и попробовать алгоритм Бентли-Оттманна