Codeforces Beta Round 74 (Div. 1 Only) |
---|
Закончено |
Вася пишет свою собственную библиотеку для построения графического пользовательского интерфейса. Свое детище Вася назвал VTK (VasyaToolKit). Одним из интересных аспектов данной библиотеки является упаковка виджетов друг в друга.
Виджетом называется некоторый элемент графического интерфейса. Каждый виджет имеет ширину и высоту, и занимает некоторый прямоугольник на экране. В Васиной библиотеке любой виджет имеет тип Widget. Далее для простоты мы будем отождествлять виджет и его тип.
Типы HBox и VBox — производные от типа Widget, поэтому тоже являются типами Widget. Виджеты HBox и VBox — особенные. Они могут хранить в себе другие виджеты. Оба эти виджета с помощью метода pack() могут вложить непосредственно в себя какой либо другой виджет. Виджеты типов HBox и VBox могут хранить в себе несколько других виджетов, в том числе несколько одинаковых — они просто будут отображены несколько раз. В результате выполнения метода pack() сохраняется только ссылка на вложенный виджет, то есть при изменении вложенного виджета, его изображение в виджете, в который он вложен, тоже изменится.
Будем считать, что виджет a вложен в виджет b если существует цепочка виджетов a = c1, c2, ..., ck = b, k ≥ 2, для которых ci вложен непосредственно в ci + 1 для любого 1 ≤ i < k. В Васиной библиотеке не допускается ситуация, что виджет a вложен в виджет a (то есть в себя) — при попытке вложить виджеты друг в друга таким образом сразу же выдается ошибка.
Также виджеты HBox и VBox имеют параметры border и spacing, которые задаются методами set_border() и set_spacing() соответственно. По умолчанию оба этих параметра равны 0.
На картинке выше видно каким образом виджеты упаковываются в HBox и VBox. При этом HBox и VBox автоматически меняют свой размер в зависимости от размеров вложенных виджетов. Сами HBox и VBox отличаются только тем, что в HBox виджеты упаковываются по горизонтали, а в VBox — по вертикали. При этом параметр spacing задает расстояние между соседними виджетами, а border — рамку вокруг всех вложенных виджетов нужной ширины. Вложенные виджеты располагаются ровно в том порядке, в котором для них был вызван метод pack(). Если внутри HBox или VBox нет ни одного вложенного виджета, то их размеры равны 0 × 0 вне зависимости от параметров border и spacing.
Построение всех виджетов идет с помощью скриптового языка VasyaScript. Описание этого языка вы найдете в описании входных данных.
Для контрольной проверки верности своего кода Вася просит написать вас программу, вычисляющую размеры всех виджетов по исходному коду на языке VasyaScript.
В первой строке находится целое число n — количество инструкций (1 ≤ n ≤ 100). В последующих n строках располагаются инструкции на языке VasyaScript по одной инструкции на строку. Ниже приведен список возможных инструкций.
Все инструкции записаны без пробелов в начале и в конце строки, слова внутри инструкции разделены ровно одним пробелом. Непосредственно перед числами и непосредственно после них пробелов нет.
Регистр букв имеет значение, то есть, например «wiDget x» — некорректная инструкция. Во входных данных регистр букв соблюден.
Все названия виджетов состоят из малых латинских букв и имеют длину от 1 до 10 символов включительно. Названия всех виджетов попарно различны. Все числа в скрипте целые от 0 до 100 включительно.
Гарантируется, что приведенный скрипт корректен, то есть все действия с виджетами происходят после их создания и никакой виджет не вложен сам в себя. Гарантируется, что в скрипте создается хотя бы один виджет.
Для каждого виджета в отдельной строке выведите через пробел его название, ширину и высоту. Строки должны быть упорядочены лексикографически по названию виджета.
Пожалуйста, не используйте спецификатор %lld для чтения или записи 64-х битовых чисел на С++. Рекомендуется использовать поток cout (также вы можете использовать спецификатор %I64d).
12
Widget me(50,40)
VBox grandpa
HBox father
grandpa.pack(father)
father.pack(me)
grandpa.set_border(10)
grandpa.set_spacing(20)
Widget brother(30,60)
father.pack(brother)
Widget friend(20,60)
Widget uncle(100,20)
grandpa.pack(uncle)
brother 30 60
father 80 60
friend 20 60
grandpa 120 120
me 50 40
uncle 100 20
15
Widget pack(10,10)
HBox dummy
HBox x
VBox y
y.pack(dummy)
y.set_border(5)
y.set_spacing(55)
dummy.set_border(10)
dummy.set_spacing(20)
x.set_border(10)
x.set_spacing(10)
x.pack(pack)
x.pack(dummy)
x.pack(pack)
x.set_border(0)
dummy 0 0
pack 10 10
x 40 10
y 10 10
В первом примере виджеты располагаются следующим образом:
Название |
---|