Фігон#5776

Фігон

3 секунди
256 мегабайтів
Дуже складна

Останнім часом мова програмування "Phigon" стала дуже популярною. Її головна особливість полягає в тому, що програми на цій мові виглядають дуже короткими та лаконічними. Проте, іноді важко зрозуміти, чому вони працюють так довго.

Вам доручено розібратися з цим питанням. Першим кроком потрібно створити аналізатор програми, який визначатиме кількість виконуваних дій. Ми розглянемо спрощену модель програми на мові "Phigon". Приклади програм на цій мові наведені в кінці умови. Як і в будь-якій мові програмування, в "Phigon" є змінні. Імена змінних — це рядки з малих латинських літер довжиною не більше . Змінні можуть мати будь-які імена, крім "if", "while", "or", "and" і "not".

Як і в будь-якій мові програмування, в "Phigon" є арифметичні вирази, що складаються з цілих чисел, змінних і знаків арифметичних операцій "+", "-" і "*". Формально, арифметичні вирази в "Phigon" задаються наступним чином:

<арифметичний вираз> ::= <доданок> | (+|-) <арифметичний вираз>

<доданок> ::= <множник> | <множник> * <доданок>

<множник> ::= -<множник> | <невід'ємне число> | <змінна> | (<арифметичний вираз>)

Таким чином, як і в будь-якій мові програмування, в "Phigon" унарний мінус має вищий пріоритет, ніж множення, а воно, в свою чергу, має вищий пріоритет, ніж додавання. Кожне від'ємне число, що зустрічається в програмі, вважається отриманим в результаті застосування унарного мінуса до відповідного додатного числа. Наприклад, запис від'ємного числа виду -42 означає застосування унарного мінуса до невід'ємного числа 42.

Як і в будь-якій мові програмування, в "Phigon" є оператори присвоєння, які виглядають наступним чином:

<оператор присвоєння> ::=

<змінна> = <арифметичний вираз>

В результаті виконання такого оператора змінній, що стоїть зліва, присвоюється значення арифметичного виразу, що стоїть справа.

Починаючи з моменту першого присвоєння, змінна вважається оголошеною, і її можна використовувати в арифметичних виразах.

Як і в будь-якій мові програмування, в "Phigon" є логічні вирази, що складаються з арифметичних виразів, знаків порівняння "<", "<=", ">", ">=", "==", "!=" і логічних операторів "and", "or" і "not". Формально,

<логічний вираз> ::= <кон'юнкція> | <кон'юнкція> or <логічний вираз>

<кон'юнкція> ::= <логічна умова> | <логічна умова> and <кон'юнкція>

<логічна умова> ::= not <логічна умова> | <арифметичний вираз>

(<|<=|>|>=|==|!=) <арифметичний вираз> | (<логічний вираз>).

Таким чином, як і в будь-якій мові програмування, в "Phigon" заперечення має вищий пріоритет, ніж оператор кон'юнкції "І", а він, у свою чергу, має вищий пріоритет, ніж оператор диз'юнкції "АБО".

Як і в будь-якій мові програмування, в "Phigon" є умовний оператор, що має наступний вигляд:

<умовний оператор> ::=

if <логічний вираз>:

<відступ><блок операторів>

де <блок операторів> — це певна послідовність операторів, що йде з додатковим відступом в пробіли. Формальне визначення для <блок операторів> ми дамо пізніше. Як і в будь-якій мові програмування, якщо логічний вираз істинний, то відповідний блок операторів виконується, а якщо хибний — то ні. Зазначимо, що при наявності вкладеного умовного оператора, у відповідного блоку операторів вже буде відступ в пробілів, і так далі.

Як і в будь-якій мові програмування, в "Phigon" є оператор циклу, що має наступний вигляд:

<оператор циклу> ::=

while <логічний вираз>:

<відступ><блок операторів>

де, як і в умовному операторі, <блок операторів> — це певна послідовність операторів, що йде з додатковим відступом в пробіли. Як і в будь-якій мові програмування, блок операторів виконується знову і знову, поки логічний вираз є істинним.

Таким чином ми, нарешті, можемо визначити загальний вигляд програми на мові програмування "Phigon". Програма являє собою блок операторів присвоєння, умовних операторів і операторів циклу:

<блок операторів> ::= <оператор> | <оператор> <блок операторів>

<оператор> ::= <оператор присвоєння> | <умовний оператор> | <оператор циклу>

Ваше завдання полягає в тому, щоб дізнатися значення змінних після виконання програми і скільки разів було виконано кожну з операцій =, +, - (сумарно як бінарний і як унарний), *, <=, >=, <, >, ==, !=, and, not, or.

Вхідні дані

У вхідному файлі задана програма на мові "Phigon". Кожна інструкція розташована на своєму рядку. Порожніх рядків немає. Довжина кожного рядка не перевищує . У програмі не більше інструкцій. Гарантується, що значення всіх проміжних обчислень і числових констант в програмі за модулем строго менше 10^{500}.

Гарантується, що перед використанням кожної змінної в арифметичних виразах її значення було визначено в операторі присвоєння.

Вихідні дані

Виведіть інформацію про кількість виконаних операцій у наступному форматі: для кожної операції, яка була виконана, виведіть рядок операція: c, де c — це кількість разів, скільки була викликана ця операція. Інформацію про операції треба виводити в лексикографічному порядку (зверніть увагу на другий приклад).

Після цього виведіть рядок "total N operations", де N — сумарна кількість виконаних операцій. Гарантується, що загальне число операцій не перевищує .

Після цього через порожній рядок виведіть інформацію про значення змінних після виконання програми у форматі Ім'я змінної: v, де v — значення змінної в порядку лексикографічного зростання імен змінних.

Приклади

Приклад 1

Loading
Loading