만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

빠른 디버거

시간 제한1초메모리 제한2048 MB

요약
네 개의 8비트 레지스터에 대한 비트 연산과 중첩 반복문으로 이루어진 프로그램에서, 처음 k개 명령을 실행한 뒤의 레지스터 값을 구합니다.
난이도

어려움10점 중 8점

유형
비트 연산, 분할 정복, 시뮬레이션
정답자
아직 제출이 없습니다

문제

최근 오래된 컴퓨터를 한 대 받았습니다. 이 컴퓨터는 8비트 CPU를 사용하고, 레지스터는 ax, bx, cx, dx 네 개입니다. 지원하는 명령어는 몇 가지 단순한 것뿐입니다. 어셈블리 언어에 익숙하지 않은 분을 위해 간단히 설명을 덧붙입니다.

각 레지스터는 8비트이며, 값은 [0,255][0, 255] 범위의 정수로 볼 수 있습니다.

이 CPU는 비트 OR, 비트 AND, 비트 XOR 세 가지 비트 연산을 지원합니다. 각 연산에는 두 종류의 명령어가 있습니다.

1형은 두 피연산자가 모두 레지스터입니다. or r1 r2 형태로 쓰며, r1과 r2는 각각 ax, bx, cx, dx 중 하나입니다. 두 레지스터가 같은 레지스터일 수 있습니다. 이 명령어는 r1의 값을 r1과 r2의 비트 OR 결과로 바꿉니다. AND와 XOR 명령어는 and r1 r2, xor r1 r2로 씁니다.

2형은 피연산자 하나가 즉시값입니다. ori r imm 형태로 쓰며, r은 레지스터이고 imm은 명령어에 주어지는 [0,255][0, 255] 범위의 상수입니다. 이 명령어는 r의 값을 r과 imm의 비트 OR 결과로 바꿉니다. AND와 XOR 버전은 andi r imm, xori r imm입니다.

어셈블러는 간단한 반복문을 지원합니다. repeat m 문을 만나면 repeat 블록의 내용을 총 mm번 실행합니다. 형식은 다음과 같습니다.

repeat m
<repeat block>
end

여기서 mm은 [2,255][2, 255] 범위의 상수입니다. <repeat block>은 하나 이상의 문으로 이루어지며, 각 문은 비트 연산 명령어이거나 중첩된 repeat-end 문입니다.

여러분은 이 CPU의 시뮬레이터를 작성합니다. 올바른 프로그램과 qq개의 질의가 주어집니다. 각 질의는 다섯 정수 k,a0,b0,c0,d0k, a_0, b_0, c_0, d_0로 이루어집니다. 처음에 ax =a0= a_0, bx =b0= b_0, cx =c0= c_0, dx =d0= d_0로 설정합니다. 프로그램이 비트 연산 명령어를 kk개 실행한 뒤의 네 레지스터 값을 출력하세요.

입력

첫 줄에 명령어 개수 nn과 질의 개수 qq가 주어집니다 (1≤n≤120001 \leq n \leq 12000, 1≤q≤100001 \leq q \leq 10000).

이어서 nn개의 줄에 위에서 설명한 형식의 명령어가 한 줄씩 주어집니다.

다음 qq개의 줄에는 다섯 정수 k,a0,b0,c0,d0k, a_0, b_0, c_0, d_0가 주어집니다 (1≤k≤1091 \leq k \leq 10^9, 0≤a0,b0,c0,d0≤2550 \leq a_0, b_0, c_0, d_0 \leq 255). 프로그램은 비트 연산 명령어를 kk개 실행하기 전에 종료되지 않는다고 보장됩니다.

출력

qq개의 줄을 출력합니다. ii번째 줄에는 프로그램이 비트 연산 명령어를 kk개 실행한 뒤의 ax, bx, cx, dx 값인 네 정수 ak,bk,ck,dka_k, b_k, c_k, d_k를 출력합니다.

예제1

  1. 예제 1

    입력
    6 2
    repeat 5
    xor ax bx
    xori ax 3
    and cx ax
    xor cx dx
    end
    10 1 2 4 3
    8 4 1 2 3
    
    예상 출력
    0 2 2 3
    4 1 3 3