스타가 즐겨하는 게임에서 이벤트로 멀리뛰기 미니게임을 출시했다. 미니게임에 과몰입하던 스타는 프레임마다 입력되는 커맨드가 주어질 때 예상 기록을 계산해 보려고 한다. 다음 명세를 보고 프레임마다 커맨드 입력 여부 및 입력한 커맨드의 종류가 주어질 때 멀리뛰기 기록을 계산해 주는 프로그램을 만들어 보자.
먼저 플레이어의 능력치는 아래와 같다.
$\text{base}_x$: 플레이어의 기본 $x$축 속도이다.
$\text{jump}$: 플레이어의 점프력이다.
$\text{dash}$: 플레이어의 대시 상태를 표현하는 값이다.
$\text{quick}$: 퀵 드롭 상태이면 $1$ 아니면 $0$이다.
$\text{accel}$: 가속 상태이면 $1$ 아니면 $0$이다.
$\text{weak}$: 중력 약화 상태면 $1$ 아니면 $0$이다.
$\text{maxdrop}$ : 플레이어의 최대 낙하 속도다.
$\text{motion}$: 플레이어가 아이템 사용모션을 취하고 있는 상태면 $1$ 아니면 $0$이다.
그 외 게임과 관련된 정보는 아래와 같다.
미니게임에서는 이동 스킬, 공격 스킬, 버프 스킬 그리고 소비 아이템을 사용할 수 있다. 각 스킬과 아이템에 대한 명세는 다음과 같다.
이동 스킬
대시
에어 점프
퀵 드롭
공격 스킬
회전 공격
수평 대시 공격
우상향 대시 공격
버프 스킬
가속
중력 약화
소비 아이템
폭탄
쉴드
포션
미니게임은 프레임마다 아래 과정들을 순서대로 실행한다.
착지 상태인지 판단한다. 착지 상태란 플레이어의 $y$좌표가 $0$이면서 회전 상태가 아닌 상태이다. 착지 상태라면 게임을 종료한다.
플레이어의 일부 능력치를 변경한다. 해당 단계에서 변경되는 능력치는 다음과 같다.
입력된 커맨드를 적용한다. 만약에 현재 프레임에서 사용할 수 없는 스킬이나 아이템에 대한 커맨드라면 적용하지 않고 무시한다.
$x$축 방향으로 이동한다. 플레이어의 $x$축 속도만큼 $x$좌표가 증가하며 $x$축 속도 $v_x$는 아래와 같이 계산한다.
$$v_x = (1+\text{dash}+5 \cdot \text{quick}) \cdot (1+\text{accel}) \cdot \text{base}_x \cdot (1-\text{motion})$$
$$g = \left\lfloor \frac{\text{base}_g}{1+\text{weak}} \right\rfloor$$
플레이어는 처음에 $(0, \text{init}_y)$에서 $y$축 속도는 $\text{jump}$로 시작한다. 플레이어가 착지한 위치가 $(X, 0)$이라면 멀리뛰기 기록은 $X$가 된다.
첫째 줄에는 플레이어의 능력치 중 $\text{base}_x, \text{jump}, \text{maxdrop}$이 공백으로 구분되어 주어진다. $(1 \leq \text{base}_x \leq 100; 1 \leq \text{jump} \leq 100; 1 \leq \text{maxdrop} \leq 10\,000)$
둘째 줄에는 게임과 관련된 정보 중 $\text{base}_g, \text{init}_y$가 공백으로 구분되어 주어진다. $(1 \leq \text{base}_g \leq 100; 1 \leq \text{init}_y \leq 100\,000)$
셋째 줄에는 커맨드 입력 여부 및 입력된 커맨드가 주어지는 프레임의 수 $N$이 주어진다. $(1 \leq N \leq 1\,000\,000)$
넷째 줄부터 $N$개의 줄에는 커맨드 입력 여부 및 입력된 커맨드의 종류가 한 줄에 한 프레임씩 주어진다. d는 대시, aj는 에어 점프, qd는 퀵 드롭, ra는 회전 공격, hda는 수평 대시 공격, ruda는 우상향 대시 공격, acc는 가속 버프, gw는 중력 약화 버프, bomb는 폭탄, shield는 쉴드, potion는 포션 커맨드를 사용했음을 의미하며, none은 어떠한 커맨드도 입력하지 않았음을 의미한다.
플레이어의 멀리뛰기 기록을 출력한다.
주어진 $N$개의 프레임 이후에는 커맨드가 입력되지 않으며 착지 상태가 아닌 경우 착지 상태가 될 때까지 게임은 계속 진행됨에 유의한다.