eolymp
bolt
Try our new interface for solving problems
Problems

Syntax UML (RU)

Syntax UML (RU)

\includegraphics{https://static.e-olymp.com/content/b6/b6ced5447c477b50a7cc6cd8a6ad2f4b486e8a9c.jpg} \textbf{UML} (Unified Modelling Language) - унифицированный язык моделирования, который применяется для разработки сложных объектно-ориентированных программных проектов. Одним из элементов UML является диаграмма деятельности, предназначенная для описания алгоритмов поведения взаимодействующих параллельных процессов. В простейшем случае диаграмму деятельности можно представить схемой, состоящей из вершин и дуг. Каждая вершина соответствует некоторой деятельности языка, а дуга - передаче управления между двумя вершинами. Назовем схему правильной, если она состоит из вершин следующих пяти видов: 1. \textbf{Состояние.} В такой вершине выполняется некоторое действие. Она имеет не более одной входящей дуги и не более одной выходящей. 2. \textbf{Ветвление.} Эта вершина имеет одну входящую дугу и две или более выходящих. Каждой выходящей дуге соответствует некоторое условие, причем из всех условий только одно должно быть истинно. По дуге, которой соответствует истинное условие, передается управление. 3. \textbf{Слияние.} Вершина этого вида имеет две или более входящих дуг и одну выходящую. Слияние означает окончание нескольких вариантов условного поведения, которые были начаты соответствующим ветвлением. 4. \textbf{Разделение.} Такая вершина имеет одну входящую дугу и не менее двух выходящих. Она предназначена для описания параллельного поведения системы. При исполнении разделения управление передается по всем выходящим дугам. 5. \textbf{Соединение.} Эта вершина имеет две или более входящих дуг и одну выходящую. Соединение исполняется, если оно получает управление по всем входящим дугам. Таким образом, условное поведение изображается с помощью ветвлений и слияний, а параллельное поведение - с помощью разделений и соединений. В \textbf{UML}-схеме выделены две вершины вида состояние: начальная и конечная. Функционирование диаграммы начинается в начальном состоянии и заканчивается в конечном. Каждая вершина достижима из начального состояния и из каждой вершины достижимо конечное состояние. Путь - это последовательность вершин в диаграмме. Входом вершины назовем такую вершину, у которой выходящая дуга входит в данную вершину. Выходом вершины назовем такую вершину, у которой входящая дуга выходит из данной вершины. Некоторые сочетания ветвлений и разделений сложно или даже невозможно интерпретировать на традиционных фон-неймановских вычислительных системах. Одной из причин является то, что они порождают потенциально бесконечное количество параллельных путей. Поэтому и стандарт \textbf{UML}, и большинство его реализаций определяют различные ограничения на структуру диаграммы. Ваша задача - написать программу, которая просматривает описание диаграммы и проверяет ее правильность и соответствие следующим ограничениям: * Пути исполнения, вышедшие из разделения, не могут проходить через одно и то же состояние, ветвление или слияние. * Пути исполнения, вышедшие из одного ветвления, не могут проходить через одно и то же состояние, разделение или соединение. * Каждому ветвлению соответствует отдельное слияние, в котором заканчиваются всевозможные пути исполнения, начавшиеся в этом ветвлении. * Каждому разделению соответствует одно соединение, в котором заканчиваются все пути исполнения, начавшиеся в этом разделении. * Входы и выходы вершин вида ветвление, разделение, слияние и соединение могут быть только состояниями. * Входы и выходы состояний могут быть любыми вершинами. * Для упрощения диаграммы разрешается для нескольких разделений указывать одно соединение, объединяющее все пути соответствующих разделений. * Аналогично, для нескольких ветвлений можно указывать одно общее слияние. Диаграмма деятельности языка \textbf{UML} задается следующим образом. Каждая вершина диаграммы помечается целым числом - номером вершины. Вид вершины обозначается большой латинской буквой: \textbf{S} - состояние (State), \textbf{D} - ветвление (Decision Activity), \textbf{M} - слияние (Merge), \textbf{B} - разделение (Synchronization Bar), \textbf{J} - соединение (Join). Пример простой диаграммы деятельности языка \textbf{UML} приведен на рисунке. В нем \textbf{0} - начальное состояние, \textbf{17} - заключительное, \textbf{2}, \textbf{10} - разделение, \textbf{14} - соединение, \textbf{5} - ветвление, \textbf{8} - слияние. Все остальные вершины диаграммы - состояния. \InputFile В первой строке входного файла указано целое число \textbf{N} (\textbf{N} <= \textbf{10000}) - количество элементов диаграммы. Вершины диаграммы пронумерованы числами от \textbf{0} до \textbf{N - 1}. Начальное состояние имеет номер \textbf{0}, а заключительное - (\textbf{N - 1}). В каждой из следующих \textbf{N} строк описываются по порядку вершины диаграммы, по одной на строке. Описание одной вершины содержит в первой позиции строки один символ - вид вершины, а далее (в зависимости от вида вершины) может следовать информация о входах и выходах. Для начального состояния указан только номер выхода, а для заключительного - только номер входа. Для всех состояний, кроме начального и заключительного, указан сначала номер входа, и затем номер выхода. Для остальных видов вершин дополнительная информация отсутствует. \OutputFile В результирующий файл вы должны вывести строку \textbf{CORRECT}, если диаграмма правильная и соответствует всем оговоренным в условии ограничениям. В противном случае необходимо вывести строку \textbf{INCORRECT} .
Time limit 1 second
Memory limit 64 MiB
Input example #1
18
S 1
S 0 2
B
S 2 9
S 2 5
D
S 5 8
S 5 8
M
S 3 10
B
S 10 14
S 10 14
S 10 14
J
S 14 17
S 8 14
S 15
Output example #1
CORRECT