Еще одно очень красивое и очень странное решение через словари.
n = int(input())
print({1<=n<=4: "Начальная школа",
5<=n<=9: "Среднее звено",
10<=n<=11: "Старшее звено"}[True])
Здесь мы создаем неименованный словарь, который в качестве ключа использует условное выражение, а в качестве значения - соответствующую этому выражению строку.
Когда мы тут же передаем ему в качестве ключа True, словарь начнет проверять ключи и вернет именно то значение, у которого выражение-ключ было истинным.
Тогда Миша сказал: ¬М & ¬К
Коля: ¬М & С
Сергей: ¬С & М
Предположим, что М - истинно.
Тогда:
утверждение Миши ложно в 1 части и истинно в 2 части.
утверждение Коли ложно в обеих частях.
утверждение Сергея истинно в обеих частях.
Это полностью соответствует условию, ответ - М.
Проверим, впрочем, другие варианты.
Предположим, что К - истинно.
Тогда:
утверждение Миши истинно в 1 части и ложно в 2 части.
утверждение Коли истинно в 1 части и ложно в 2 части.
утверждение Сергея истинно в 1 части и ложно в 2 части.
Наконец, предположим, что С - истинно.
Тогда:
утверждение Миши истинно в обеих частях.
утверждение Коли истинно в обеих частях.
утверждение Сергея ложно в обеих частях.
Итак, ответ М.