Бинарный (двоичный) поиск

Этот листок посвящен бинарному (двоичному) поиску. Бинарный поиск позволяет найти данный элемент в отсортированном массиве или определить, что он не встречается в данном массиве за O(log n) действий, где n - количество элементов в массиве.
Бинарный поиск должен быть реализовать следующей функцией:
int BinSearch (int Arr[], int size, int key)
где Arr - массив, в котором ищется элемент, size - размер массива, key - элемент, который ищется.
Функция возвращает такое значение i, что A[i]==keу, или значение -1, если среди элементов A[0]...A[size-1] нет значения key.
Функция может быть нерекурсивной или рекурсивной. В случае рекурсивной функции необходимо добавить еще один параметр - номер начального элемента диапазона, в котором осуществляется поиск.

Во всех задачах этого листка данные читаются из файла input.txt, результат выводится в файл output.txt.

А. Разминка

Реализуйте алгоритм бинарного поиска в данном отсортированном массиве. Реализация должна быть нерекурсивной. Поиск должен быть бинарным, а не тернарным (т.е. внутри основного цикла не должно отдельно анализироваться совпадение искомого элемента со средним элементом диапазона).

На вход программа получает два числа: N и K, не превосходящие 105. Во второй строке содержится N чисел первого массива, отсортированные по возрастанию. В третьей строке содержится K чисел второго массива. Все числа натуральные, умещающиеся в 32-битный тип int.

Выведите для каждого из K чисел второго массива слово YES, если это число встречается в первом массиве и слово NO в противном случае

Пример

Ввод Вывод
5 4
1 4 5 8 9
5 6 1 9
YES
NO
YES
YES

B. Первое вхождение

Даны два массива, как в предыдущей задаче. Для каждого элемента второго массива выведите индекс его первого появления в первом массиве (число от 0 до N-1, где N – количество элементов в первом массиве), или значение -1, если этот элемент в массиве отсутствует.

Ограничения на решение: бинарный поиск должен быть реализован при помощи рекурсии, и должен быть бинарным (а не тернарным): допускается использование только двух инструкций if в теле функции бинарного поиска (один if  – проверка условия окончания поиска, второй if  – деление отрезка пополам).

Пример

Ввод Вывод
5 4
1 2 2 3 4
0 1 2 3
-1 0 1 3

C. Приближенный двоичный поиск

Заданы два массива, как в первой задаче. Для каждого из K элементов второго массива выведите число из первого массива, наиболее близкое к данному. Если таких чисел несколько - выведите наименьшее из них.

Пример

Ввод Вывод
5 4
1 4 5 8 10
5 6 1 9
5 5 1 8

D. Коровы - в стойла

На прямой расположены стойла, заданы их координаты. Необходимо расставить данное число коров (меньшее количество стойл) так, чтобы минимальное расстояние между коровами было как можно больше.
В первой строке входных данных содержится два числа: количество стойл N и количество коров K, 1≤K<N≤10000. Далее идет N натуральных чисел - координаты стойл в порядке возрастания. Координаты не превосходят 109.
Выведите одно число - наибольшее возможное допустимое расстояние.

Пример

Ввод Вывод
5 3
1 2 3 100 1000
99
Указание. Пусть d - это ответ на эту задачу. Напишите функцию, которая по данному d проверяет, можно ли расставить коров на расстоянии не менее d друг от друга. Далее нам нужно найти такое максимальное d, для которого функция возвращает true. Это можно сделать бинпоиском, т.к. d=1 заведомо подходит, а d=109+1 заведомо не подходит. Такой метод решения задачи называется "Бинарный поиск по ответу".