스택 복사 게임
시간 제한1초메모리 제한64 MB
push와 pop, 복사로 만드는 최대 30만 개 영속 스택 버전을 관리하고 pop 값과 두 버전의 공통 원소 개수를 출력합니다.
문제
미르코가 스택을 가지고 놀고 있다. 게임을 시작할 때 미르코에게는 번호가 인 빈 스택 하나만 있다. 게임의 번째 단계에서 미르코는 이미 만들어진 스택 하나를 골라 그 번호를 라 하고, 그 스택을 복사한 뒤 아래 세 가지 중 하나를 수행한다.
- 복사한 스택의 맨 위에 수 를 넣는다.
- 복사한 스택의 맨 위에 있는 수를 뺀다.
- 스택 하나를 더 골라 그 번호를 라 하고, 복사한 스택과 번 스택에 함께 들어 있는 서로 다른 수가 몇 개인지 센다.
새로 만든 스택의 번호는 가 된다.
미르코는 스택을 직접 다루기 싫어하므로, 이 과정을 대신 처리하는 프로그램을 작성하자. b 연산마다 스택에서 뺀 수를 출력하고, c 연산마다 조건을 만족하는 수의 개수를 출력한다.
입력
첫 줄에 미르코의 게임 단계 수 이 주어진다. ()
게임의 각 단계는 시간 순서대로 부터 까지의 번호로 구분한다.
다음 개의 줄 중 번째 줄에는 번째 단계의 내용이 아래 세 가지 형태 중 하나로 주어진다.
- a 연산은 "a v"
- b 연산은 "b v"
- c 연산은 "c v w"
줄의 첫 글자는 연산의 종류를 나타내고, 그 뒤에 오는 한 개 또는 두 개의 수는 연산에 쓰이는 스택 번호이며 항상 구간의 정수이다.
b 연산에서 수를 빼는 스택은 비어 있지 않다.
출력
b 연산과 c 연산마다 구한 수를 입력에 주어진 순서대로 한 줄에 하나씩 출력한다.
힌트
첫 번째 예제를 살펴보자. 처음에는 스택이 하나뿐이다. 1번째 단계에서 을 복사하고 맨 위에 을 넣어 이 된다. 2번째 단계에서 을 복사하고 맨 위에 를 넣어 가 된다. 3번째 단계에서 를 복사하고 를 빼서 이 된다. 4번째 단계에서 를 복사해 라 하고, 와 에 함께 들어 있는 수를 세면 뿐이므로 답은 이다. 5번째 단계에서 를 복사하고 를 빼서 이 된다.