n = 12 a = 3 5 2 3 3 3 1 3 1 3 3 2 ----- ----- ----- ----- -1:0 3:3 1:2 3:2 initial search ----------- ----------- 3:4 -1:0 ----------------------- 3:7 функция: [lo, hi), value -> сколько раз id -> left = id*2+1, id -> right = id*2+2 search initial: Подзадача: [lo, hi) -> какое число встречается больше половины раз? Без рекурсии. 1 2 3 4 5 1:1 1:0 3:1 3:0 5:1 Ещё раз пройдём по массиву с предположением 5. 3 5 2 3 3 3 1 3 1 3 3 2 ------>----->------>--------->----->------>------ -1:0 3:1 3:0 2:1 2:0 3:1 3:2 3:1 3:2 3:1 3:2 3:3 3:2 [-------------------------------] [-----------------] 2:>=половины не-2:>=половины то же число: счётчик +1 другое число: счётчик -1 счётчик == 0: меняем число Доказательство от противного. пусть ответ 3 а получилось 2 значит, в какой-то последний момент счётчик обнулился рассмотрим суффикс троек <=половины а префикс -- индукцией по n троек <=половины значит, и всего троек <=половины -- противоречие! Как дальше можно устроить: 0..31 управляющие процессы manager 32..63 рабочие процессы worker или 99 manager 0..98 worker сначала: базовое решение на каждом маленьком отрезке а дальше. manager -> worker: 1 lo hi value проверить число value на отрезке [lo..hi), вернуть баланс: (сколько таких чисел) минус (сколько других чисел) 0 закончить работу worker: manager := id / 2 или что там ещё work := 1 while work: command := receive (manager) if command == 0: work := 0 else: lo := receive (manager) hi := receive (manager) value := receive (manager) num := 0 for i := lo until hi: if a[i] == value: num += 1 else: num -= 1 send (manager, num)