Фігон
Останнім часом мова програмування "Phigon" стала дуже популярною. Її головна особливість полягає в тому, що програми на цій мові виглядають дуже короткими та лаконічними. Проте, іноді важко зрозуміти, чому вони працюють так довго.
Вам доручено розібратися з цим питанням. Першим кроком потрібно створити аналізатор програми, який визначатиме кількість виконуваних дій. Ми розглянемо спрощену модель програми на мові "Phigon". Приклади програм на цій мові наведені в кінці умови. Як і в будь-якій мові програмування, в "Phigon" є змінні. Імена змінних — це рядки з малих латинських літер довжиною не більше 50. Змінні можуть мати будь-які імена, крім "if", "while", "or", "and" і "not".
Як і в будь-якій мові програмування, в "Phigon" є арифметичні вирази, що складаються з цілих чисел, змінних і знаків арифметичних операцій "+", "-" і "*". Формально, арифметичні вирази в "Phigon" задаються наступним чином:
<арифметичний вираз> ::= <доданок> | (+|-) <арифметичний вираз>
<доданок> ::= <множник> | <множник> * <доданок>
<множник> ::= -<множник> | <невід'ємне число> | <змінна> | (<арифметичний вираз>)
Таким чином, як і в будь-якій мові програмування, в "Phigon" унарний мінус має вищий пріоритет, ніж множення, а воно, в свою чергу, має вищий пріоритет, ніж додавання. Кожне від'ємне число, що зустрічається в програмі, вважається отриманим в результаті застосування унарного мінуса до відповідного додатного числа. Наприклад, запис від'ємного числа виду -42 означає застосування унарного мінуса до невід'ємного числа 42.
Як і в будь-якій мові програмування, в "Phigon" є оператори присвоєння, які виглядають наступним чином:
<оператор присвоєння> ::=
<змінна> = <арифметичний вираз>
В результаті виконання такого оператора змінній, що стоїть зліва, присвоюється значення арифметичного виразу, що стоїть справа.
Починаючи з моменту першого присвоєння, змінна вважається оголошеною, і її можна використовувати в арифметичних виразах.
Як і в будь-якій мові програмування, в "Phigon" є логічні вирази, що складаються з арифметичних виразів, знаків порівняння "<", "<=", ">", ">=", "==", "!=" і логічних операторів "and", "or" і "not". Формально,
<логічний вираз> ::= <кон'юнкція> | <кон'юнкція> or <логічний вираз>
<кон'юнкція> ::= <логічна умова> | <логічна умова> and <кон'юнкція>
<логічна умова> ::= not <логічна умова> | <арифметичний вираз>
(<|<=|>|>=|==|!=) <арифметичний вираз> | (<логічний вираз>).
Таким чином, як і в будь-якій мові програмування, в "Phigon" заперечення має вищий пріоритет, ніж оператор кон'юнкції "І", а він, у свою чергу, має вищий пріоритет, ніж оператор диз'юнкції "АБО".
Як і в будь-якій мові програмування, в "Phigon" є умовний оператор, що має наступний вигляд:
<умовний оператор> ::=
if <логічний вираз>:
<відступ><блок операторів>
де <блок операторів> — це певна послідовність операторів, що йде з додатковим відступом в 4 пробіли. Формальне визначення для <блок операторів> ми дамо пізніше. Як і в будь-якій мові програмування, якщо логічний вираз істинний, то відповідний блок операторів виконується, а якщо хибний — то ні. Зазначимо, що при наявності вкладеного умовного оператора, у відповідного блоку операторів вже буде відступ в 8 пробілів, і так далі.
Як і в будь-якій мові програмування, в "Phigon" є оператор циклу, що має наступний вигляд:
<оператор циклу> ::=
while <логічний вираз>:
<відступ><блок операторів>
де, як і в умовному операторі, <блок операторів> — це певна послідовність операторів, що йде з додатковим відступом в 4 пробіли. Як і в будь-якій мові програмування, блок операторів виконується знову і знову, поки вірний логічний вираз.
Таким чином ми, нарешті, можемо визначити загальний вигляд програми на мові програмування "Phigon". Програма являє собою блок операторів присвоєння, умовних операторів і операторів циклу:
<блок операторів> ::= <оператор> | <оператор> <блок операторів>
<оператор> ::= <оператор присвоєння> | <умовний оператор> | <оператор циклу>
Ваше завдання полягає в тому, щоб дізнатися значення змінних після виконання програми і кількість разів, яке було виконано кожну з операцій =, +, - (сумарно як бінарний і як унарний), *, <=, >=, <, >, ==, !=, and, not, or.
Вхідні дані
У вхідному файлі задана програма на мові "Phigon". Кожна інструкція розташована на своєму рядку. Порожніх рядків немає. Довжина кожного рядка не перевищує 500. У програмі не більше 5000 інструкцій. Гарантується, що значення всіх проміжних обчислень і числових констант в програмі за модулем строго менше 10^500.
Гарантується, що перед використанням кожної змінної в арифметичних виразах її значення було визначено в операторі присвоєння.
Вихідні дані
Виведіть інформацію про кількість разів, які викликані операції в наступному форматі: для кожної операції, яка була виконана, виведіть рядок операція: c, де c — це кількість разів, яке була викликана ця операція. Інформацію про операції треба виводити в лексикографічному порядку (зверніть увагу на другий приклад).
Після цього виведіть рядок "total N operations", де N — сумарна кількість виконаних операцій. Гарантується, що загальне число операцій не перевищує 200000.
Після цього через порожній рядок виведіть інформацію про значення змінних після виконання програми у форматі Ім'я змінної: v, де v — значення змінної в порядку лексикографічного зростання імен змінних.