해결한 사람
0
명
정답률
0.00
%
시간 제한
2000
ms
메모리 제한
245
MB
Vasya는 그래픽 사용자 인터페이스를 구축하기 위한 자신만의 라이브러리를 작성한다. Vasya는 자신이 만든 것을 VTK (VasyaToolKit)이라고 이름 붙였다. 이 라이브러리의 흥미로운 특징 중 하나는 위젯이 서로의 안에 패킹된다는 것이다.
위젯은 그래픽 인터페이스의 한 요소이다. 각 위젯은 너비와 높이를 가지며 화면에서 어떤 직사각형 영역을 차지한다. Vasya의 라이브러리에 있는 모든 위젯의 타입은 Widget이다. 편의상 위젯과 그 타입을 동일시한다.
Types HBox and VBox은 타입 Widget의 파생 타입이므로, 이들 역시 타입 Widget이다. Widgets HBox and VBox은 특별하다. 이들은 다른 위젯을 저장할 수 있다. 이 두 위젯은 모두 pack() 메서드를 사용하여 다른 어떤 위젯을 자신의 내부에 직접 패킹할 수 있다. 타입이 HBox and VBox인 위젯은 다른 위젯 여러 개를 저장할 수 있으며, 같은 위젯 여러 개도 저장할 수 있다. 이 경우 해당 위젯은 단순히 여러 번 나타난다. pack() 메서드를 사용하면 패킹된 위젯에 대한 링크만 저장된다. 즉, 패킹된 위젯이 변경되면 그 위젯을 패킹한 위젯 안의 모습도 변경된다.
위젯 a = c1, c2, ..., ck = b, k ≥ 2인 위젯들의 연쇄가 존재하고, 모든 1 ≤ i < k에 대해 ci가 ci + 1에 직접 패킹되어 있다면, 위젯 a가 위젯 b에 패킹되어 있다고 하자. In Vasya's 라이브러리에서는 위젯 a가 위젯 a에, 즉 자기 자신에 패킹되는 상황이 허용되지 않는다. 이러한 방식으로 위젯들을 서로의 안에 패킹하려고 하면 즉시 오류가 발생한다.
또한 위젯 HBox and VBox에는 border와 spacing 매개변수가 있으며, 각각 set_border()와 set_spacing() 메서드로 정한다. 기본적으로 이 두 옵션은 모두 0이다.

위 그림은 위젯들이 HBox and VBox에 어떻게 패킹되는지를 보여 준다. 이때 HBox and VBox은 패킹된 위젯의 크기에 따라 자신의 크기를 자동으로 변경한다. HBox and VBox의 경우에는 HBox에서는 위젯이 가로로 패킹되고 VBox에서는 세로로 패킹된다는 점만 다르다. spacing 매개변수는 인접한 위젯 사이의 거리를 정하고, border는 패킹된 모든 위젯 둘레에 원하는 너비의 테두리를 정한다. 패킹된 위젯은 해당 위젯에 대해 pack() 메서드가 호출된 순서 그대로 배치된다. HBox 또는 VBox 안에 패킹된 위젯이 없다면 border와 spacing 옵션에 관계없이 그 크기는 0 × 0이다.
모든 위젯은 스크립트 언어 VasyaScript를 사용하여 생성한다. 이 언어에 대한 설명은 입력 데이터에서 확인할 수 있다.
코드를 최종적으로 검증하기 위해 Vasya는 VasyaScript 언어로 작성된 소스 코드에 있는 모든 위젯의 크기를 계산하는 프로그램을 작성해 달라고 요청한다.
첫 번째 줄에는 명령의 수를 나타내는 정수 n이 주어진다. (1 ≤ n ≤ 100) 다음 n개의 줄에는 VasyaScript 언어의 명령이 한 줄에 하나씩 주어진다. 가능한 명령의 목록은 다음과 같다.
모든 명령은 문자열의 시작과 끝에 공백 없이 작성된다. 명령 안의 단어들은 정확히 하나의 공백으로 구분된다. 숫자의 바로 앞과 바로 뒤에는 공백이 없다.
대소문자를 구분한다. 예를 들어 "wiDget x"은 올바른 명령이 아니다. 입력 데이터에서 문자의 대소문자는 올바르게 주어진다.
모든 위젯의 이름은 소문자 라틴 문자로만 이루어지며 길이는 1자 이상 10자 이하이다. 모든 위젯의 이름은 서로 다르다. 스크립트에 등장하는 모든 수는 0 이상 100 이하의 정수이다.
위에서 설명한 스크립트가 올바름이 보장된다. 즉, 위젯에 대한 모든 연산은 해당 위젯이 생성된 뒤에 이루어지며 어떤 위젯도 자기 자신에 패킹되지 않는다. 스크립트가 적어도 하나의 위젯을 생성함이 보장된다.
각 위젯에 대해 이름, 너비, 높이를 공백으로 구분하여 한 줄에 출력한다. 각 줄은 위젯 이름의 사전순으로 정렬되어야 한다.
C++에서 64비트 정수를 읽거나 쓸 때 %lld 지정자를 사용하지 말라. 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
첫 번째 예제에서 위젯들은 다음과 같이 배치된다.
