Контест Senior sync и атомики обновлено

Конкурентные переводы между счетами без дедлока

Условие

Есть n счетов с начальными балансами. m переводов from to amount выполняют w горутин-воркеров параллельно. Перевод всегда выполняется (уход в минус разрешён), перевод самому себе ничего не меняет. У каждого счёта свой мьютекс, глобальную блокировку использовать нельзя.

Ввод: n m w (1 ≤ n ≤ 1000, 1 ≤ m ≤ 4000, 1 ≤ w ≤ 32), затем n балансов, затем m переводов (номера счетов с 0).

Вывод: итоговые балансы через пробел, затем строка с суммой всех балансов.

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

Пример

3 4 2
100 50 0
0 1 30
1 2 80
2 0 10
0 2 5
75 0 75
150

Как подойти

Мьютекс на счёт, блокировка в порядке возрастания id, особый случай from == to.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.