Получилось, но "в общем виде" не дотянулся. Псевдокод
C++ (Qt)
template <class Key, class Container>
void FindMultiRecursive( 
	const Container & data,	// data container
	const Key & loKey,		// min key to search
	const Key & hiKey,		// max key to search
	SInt32 beg, SInt32 end )	// search range indices
{
	 while (end - beg > 1) {
		SInt32 mid = (beg + end) / 2;
		const Key & midKey = data[mid];
		if (midKey < loKey)
			beg = mid;
		else
			if (midKey > hiKey)
				end = mid;
			else {
				// here is most interesting
				// ...
				//
				FindMultiRecursive(data, loKey, midLoKey, beg, mid);
				FindMultiRecursive(data, midHiKey, hiKey, mid, end);
				return;
			}
	}		
}
 
Смысл в том что искомый диапазон лежит внутри индексов поиска, схема
Key[beg]------------- loKey --------- hiKey ----------Key[end]
Когда поиск попадает между 2 искомыми ключами, выбираются 2 новых ключа из искомого диапазона и крутим рекурс