тут в первую очередь надо определиться со структурой данных. Массив? надо сортировать. Огромный массив - надо долго сортировать.
А так как множество натуральных чисел, пусть будет массив bool значений, при том индекс элемента массива - натуральное число, а значение элемента - его наличие в множестве. В таком случае нам все равно придется перебрать m-n значений, но не надо будет ничего сортировать, да и реализовано может быть прямо ассемблерной вставочкой, что должно существенно ускорить код.
Другой вариант если мы все таки не хотим перебирать - создать сложную структуру, в которой множество меняется путем добавления или удаления "островов" натуральных чисел или островов их отсутствия.
В таком случае предположим у нас есть множество 0-inf(1-inf, если вы натуральный нулененавистник). Пусть мы убрали из него числа 4 и 5, тогда добавим в структуру остров [4:5]. Убрали еще числа 7-1110, также добавляем выколотый остров 7:1110. Добавили 666, значит или делим остров или добавляем остров другого типа(в зависимости от реализации). Когда множество будет готово,нужно будет сравнить его со всеми островами и в зависимости от их типа, если M,N принадлежит острову натуральных чисел или между M и N отсутствуют выколотые острова, мы делаем вывод о том, содержит ли множество все эти числа. Теоретически такой подход выигрышен при стремлении размерности множества к бесконечности и при конечном количестве островов. На практике, я бы блеснул этими решениями на собеседовании и больше никогда не возвращался бы к таким задачам)