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)
