Олимпиадный тренинг

Задача . Покраска холста - 2


Радиоуправляемый робот умеет перемещаться по клетчатому полю размером \(n \times m\) (\(n\) строк и \(m\) столбцов) и красить клетки в один из четырех цветов (красный, зеленый, синий и белый). Будем обозначать клетку на пересечении \(i\)-й сверху строки и \(j\)-го слева столбца как \((i, j)\).

Робот выполняет команды пользователя, при этом перемещаясь по полю в соответствии с заданными настройками и ограничениями.

Настройки представляют собой матрицу \(S\) размера \(n \times m\), каждый элемент которой — либо \(\varnothing\), либо пара из координат клетки и цвета. Если \(S_{i,j} = ((i', j'), c)\), то после того, как робот красит клетку \((i, j)\) в какой-либо цвет, он сразу же перемещается в клетку \((i', j')\) и красит ее в цвет \(c\). Если для новой покрашенной клетки \(S_{i',j'} \neq \varnothing\), процесс продолжается по тем же правилам.

Ограничения бывают двух типов:

  1. ограничение на минимальное требуемое число клеток цвета \(c\);

  2. запрет наличия на поле квадрата \(2 \times 2\), покрашенного цветами \(\begin{pmatrix} c_{1,1} & c_{1,2} \\ c_{2,1} & c_{2,2} \end{pmatrix}\).

Пользователю доступны следующие команды для взаимодействия с роботом:

  1. <<fill \(i\) \(j\) with \(c\)>> — закрасить клетку \((i, j)\) в цвет \(c\), после чего выполнять действия в соответствии с настройками; процесс останавливается, когда

    • очередное перемещение привело робота за границу поля;

    • очередное перемещение привело робота в клетку, которую он уже красил в процессе выполнения текущей команды;

    • для очередной клетки \(S_{i',j'} = \varnothing\);

    • с очередной покраской перестанет выполняться какое-то из ограничений.

    Обратите внимание, что если первая же покраска клетки \((i, j)\) в цвет \(c\) приводит к нарушению какого-то из ограничений, робот остановится сразу же, не покрасив ни одну клетку.

  2. <<at-least \(x\) \(c\)>> — выставить ограничение на минимальное число клеток цвета \(c\) в \(x\). Если в настоящий момент на поле меньше \(x\) клеток цвета \(c\), команда игнорируется и ограничение не меняется. Для каждого цвета в каждый момент времени действует только последнее введенное на него ограничение на число клеток.

  3. <<no-squares \(c_{1,1}\) \(c_{1,2}\) \(c_{2,1}\) \(c_{2,2}\)>> — запретить появление квадратов \(2 \times 2\), раскрашенных цветами \(\begin{pmatrix} c_{1,1} & c_{1,2} \\ c_{2,1} & c_{2,2} \end{pmatrix}\). Если в настоящий момент на поле уже есть квадрат, раскрашенный таким образом, команда игнорируется и ограничение не добавляется.

  4. <<allow-squares \(c_{1,1}\) \(c_{1,2}\) \(c_{2,1}\) \(c_{2,2}\)>> — аналогично, отменить запрет на раскрашенные соответствующим образом квадраты \(2 \times 2\), если такой запрет сейчас есть.

  5. <<move \(i\) \(j\) to \(i'\) \(j'\) \(c\)>> — выставить настройки для клетки \((i, j)\) в значение \(((i', j'), c)\), где \((i', j')\) — клетка, в которую надо переместиться, а \(c\) — цвет, в который затем надо ее покрасить.

  6. <<no-move \(i\) \(j\)>> — выставить настройки для клетки \((i, j)\) в значение \(\varnothing\), соответствующее отсутствию перемещения после покраски клетки \((i, j)\).

Еще раз повторим, что робот никогда не красит одну и ту же клетку дважды во время исполнения одной команды, а также останавливается до момента первого нарушения какого-либо ограничения. Например, если \(S_{1,1} = ((1, 2), \mathtt{red})\), \(S_{1,2} = ((2, 2), \mathtt{blue})\), \(S_{2,2} = ((2, 1), \mathtt{green})\) и \(S_{2,1} = ((1, 1), \mathtt{red})\), то при поступлении команды <<fill \(1\) \(1\) with blue>>, робот покрасит \((1, 1)\) в синий, \((1, 2)\) в красный, \((2, 2)\) в синий и \((2, 1)\) в зеленый. Затем робот остановится, так как клетка \((1, 1)\) уже была покрашена при исполнении этой команды.

Изначально все настройки равны \(\varnothing\), никакие ограничения не введены, а все клетки поля покрашены в белый цвет. Вам дан список из \(q\) команд пользователя, которые были последовательно отправлены роботу. Выведите раскраску поля после применения всех этих команд.

Формат входных данных
В первой строке записано целое число \(t\) (\(1 \le t \le 1000\)) — число наборов входных данных в тесте.

В первой строке каждого набора данных даны три целых положительных числа \(n\), \(m\) и \(q\) — размеры поля и число команд. Гарантируется, что сумма \(n \cdot m \cdot q\) по всем наборам входных данных не превосходит \(10^5\).

В следующих \(q\) строках дано описание команд, посланных роботу в формате, описанном в условии. Цвета задаются строками <<red>> (красный), <<green>> (зеленый), <<blue>> (синий) и <<white>> (белый).

Формат выходных данных
Для каждого набора входных данных выведите итоговую раскраску поля, полученную после обработки всех команд. Для обозначения красного, зеленого или синего цвета используйте первую букву его английской записи (‘r’, ‘g’ или ‘b’); для обозначения белого цвета используйте символ ‘.’.


Примечание

В первом примере из условия

  1. Команда <<fill 1 1 with red>> красит \((1, 1)\) в красный, после чего из-за \(S_{1,1} = ((2, 1), \mathtt{red})\) клетка \((2, 1)\) тоже красится в красный, а из-за \(S_{2,1} = ((3, 1), \mathtt{red})\) затем и \((3, 1)\) красится в красный.

  2. При выполнении <<fill 2 1 with green>> робот красит \((2, 1)\) в зеленый. \(S_{2,1}\) в этот момент уже равно \(((2, 2), \mathtt{blue})\), поэтому после этого клетка \((2, 2)\) должна быть покрашена в синий, но это бы нарушило ограничение <<at-least 3 white>>, поэтому процесс останавливается до этого.

  3. После этого поле выглядит как

    r.
    g.
    r.
  4. Затем <<fill 2 2 with R>> должен покрасить \((2, 2)\) в красный (ограничение на число белых уже снято), но это бы привело к получению квадрата с цветами r.gr, который запрещен, поэтому выполнение команды сразу останавливается.

  5. Последняя команда покраски <<fill 2 2 with B>> выполняется. После чего, в соответствии с \(S_{2,2} = ((1, 2), \mathtt{green})\), клетка \((1, 2)\) красится в зеленый.

  6. Итоговый рисунок:

    rg
    gb
    r.

time 1000 ms
memory 256 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
 Кол-во
Python1
Комментарий учителя