|
|
| Имя входного файла |
стандартный ввод |
| Имя выходного файла |
стандартный ввод |
| Ограничение по времени |
1.5 секунды |
| Ограничение по памяти |
256 МБ |
Глеб решил изучить новый для себя язык программирования. Так как C++ показался ему слишком простым, он выбрал язык Bassembly. Язык этот пока молодой, поэтому найти удалось только его документацию.
Доступные регистры на данном языке: eax, ecx, edx, esi и edi.
Каждый регистр хранит беззнаковое 32-битное целое число. Все арифметические операции над регистрами выполняются по модулю 232: при переполнении старшие биты отбрасываются. Например, число 232 эквивалентно 0, а число -1 эквивалентно 232−1.
Bassembly поддерживает пять команд:
add, sub, mul, inc, print.
Обозначим через reg, reg1, reg2, reg3 произвольные регистры из списка выше, а через const — неотрицательное целое число от 0 до 232−1.
Команда add
Команда add может иметь несколько форм.
-
add 0 const — выполнить операцию eax+=const.
-
add 1 reg — выполнить операцию eax+=reg.
-
add 2 reg1 reg2 — выполнить операцию reg1+=reg2.
Команда sub
Команда sub также может иметь несколько форм.
-
sub 0 const — выполнить операцию eax−=const.
-
sub 1 reg — выполнить операцию eax−=reg.
-
sub 2 reg1 reg2 — выполнить операцию reg1−=reg2.
Команда mul
Команда mul имеет две формы.
-
mul 1 reg1 — вычислить произведение eax⋅reg1 и сохранить его в пару регистров [ecx:eax].
-
mul 2 reg1 reg2 — вычислить произведение reg1⋅reg2 и сохранить его в пару регистров [ecx:eax].
Здесь запись [ecx:eax] обозначает 64-битное число, у которого старшие 32 бита записываются в ecx, а младшие 32 бита — в eax.
Команда inc
Команда inc reg выполняет операцию reg+=1.
Команда print
Команда print reg выводит текущее значение регистра reg.
Все регистры в начале выполнения программы равны 0.
Но Глеб ещё только учится писать программы на этом языке, поэтому иногда допускает опечатки.
Если название команды в строке записано неверно, то строка считается ошибочной. Если же название команды записано верно, то гарантируется, что все остальные элементы этой строки корректны, кроме, возможно, названий регистров. Таким образом, при корректно записанной команде опечатки могут встречаться только в названиях регистров.
Программа обрабатывается построчно сверху вниз. Если в некоторой строке обнаруживается опечатка, то все предыдущие корректные строки считаются уже выполненными. В частности, должны быть выведены все значения, которые были напечатаны командами print в предыдущих строках.
После этого необходимо вывести номер первой ошибочной строки и завершить выполнение.
Если ошибочных строк в программе нет, требуется выполнить все команды по порядку и вывести все значения, которые будут напечатаны командами print.
Формат входных данных
В первой строке дано одно число n — количество команд (1≤n≤105).
В следующих n строках содержится описание программы, по одной строке на каждую команду.
Строки программы нумеруются от 1 до n в порядке их следования во входных данных.
Формат выходных данных
Если в программе встречается ошибочная строка, необходимо вывести все значения, которые были напечатаны командами print до первой ошибки, по одному в строке. После этого в отдельной строке необходимо вывести номер первой ошибочной строки.
Если ошибочных строк в программе нет, требуется вывести все значения, которые будут напечатаны командами print, по одному в строке.
Пример
| Стандартный ввод |
Стандартный вывод |
5
add 0 1000000000
mul 2 eax eax
print eax
print ecx
mal 2 eax eax
|
2808348672
232830643
5
|
7
add 0 10
sub 2 ecx eax
inc ecx
print ecx
sub 2 ecx ecx
print ecx
print eax
|
4294967287
0
10
|
Примечание
Обратите внимание, что ввод и вывод осуществляется через стандартный ввод и стандартный вывод. В случае отрицательного ответа системы проверки заданий по программированию советуем ознакомиться с "Рекомендациями по решению задач по программированию".