using System.Collections.Generic;
public sealed class BisectionGenerator
private Queue<Range> _queue;
public BisectionGenerator(int lower, int upper)
_queue = new Queue<Range>();
_queue.Enqueue(new Range(lower, upper));
if (_queue.Count == 0) throw new InvalidOperationException("The range has been exhausted.");
Range range = _queue.Dequeue();
int mid = (range.Lower + range.Upper) / 2;
if (range.Lower != mid) _queue.Enqueue(new Range(range.Lower, mid));
if (range.Upper != mid) _queue.Enqueue(new Range(mid, range.Upper));
public Range(int lower, int upper)
public readonly int Lower;
public readonly int Upper;
public static void Main()
var bs = new BisectionGenerator(lower, upper);
for (int i = lower; i < 8; i++)
Console.WriteLine(bs.Next());