Вообще-то код жутковат.
Поехали по порядку:
Зачем сие? В программе нигде ничего соответствующего не используется.
Аналогично предыдущему, с той лишь разницей, что этого файла просто нет.
#define NMAX 10 // размер массива
Это Вы на C++ пишете или на C, причем древнего стандарта? По-видимому, первое все-таки правильнее, поэтому забудьте о макросах (или хотя бы о макросах для объявления констант) и пишите правильно:
Пространства имен - это вообще-то довольно полезно. Но до тех пор, пока польза не выкидывается вот этим самым образом. Конечно, так можно - но лучше бы не нужно, не стоит привыкать к плохому.
В некотором смысле аналогично предыдущему. Конечно, глобальный массив сделать можно. Но без явной необходимости - не нужно.
if (s[M]<x)
el = (int)M;
else
er = (int)M;
В чем глубокий смысл приведения переменной некоторого типа к тому же самому типу? Дальше там еще один такой же случай будет...
Но в целом оно работает.