private static LongRangeNode Split(int start, int end, IList<InclusiveRange> elementaryIntervals)
{
if (start == end - 1)
{
// leaf
InclusiveRange range = elementaryIntervals[start];
return new LongRangeNode(range.start, range.end, null, null, start);
}
else
{
int mid = (int)((uint)(start + end) >> 1);
LongRangeNode left = Split(start, mid, elementaryIntervals);
LongRangeNode right = Split(mid, end, elementaryIntervals);
return new LongRangeNode(left.start, right.end, left, right, -1);
}
}