H와 W만 알 수 있는 상태에서 격자와 직사각형 정보를 입력으로 받아 직사각형 내부 합을 0번 메모리에 남기고 나머지 메모리를 0으로 비우는 G++ 코드를 작성한다.
어려움8시뮬레이션구현비트 연산수학아직 제출이 없습니다시간 제한0.1초메모리 제한256 MB세계 최고 천재인 교준이는 몇 년간의 심도 있는 연구 끝에 새로운 프로그래밍 언어 G++를 만들었다!
G++는 다음과 같은 연산을 지원한다:
G++ 코드를 실행할 경우, 가장 첫 번째 연산부터 순차적으로 실행된다. 실행 즉시, int형 변수 103개가 배정된 메모리가 할당된다. 따라서 여러분의 코드가 x번 메모리에 접근한다면, 0≤x<103라야 하며, 이를 만족하지 않으면, Memory Error가 발생한다. 실행 초기, 모든 103개의 변수는 0으로 초기화되어 있다.
G++ 코드의 총 연산 횟수는 105을 넘지 않아야 한다. 만일 이를 만족하지 않으면, Time Limit Exceeded Error가 발생한다.
G++ 코드의 총 메모리 접근 횟수는 105을 넘지 않아야 한다. 만일 이를 만족하지 않으면, Access Limit Exceeded Error가 발생한다.
교준이는 완벽주의자다. 따라서 여러분의 G++ 코드에는 불필요한 공백이나 개행이 있어서는 안된다. 또한 G++ 코드의 마지막 문자는 개행 문자여야 한다. 만일 이를 만족하지 않을 경우, Compile Error가 발생한다.
뿐만 아니라, 여러분의 G++ 코드가 Undefined Behavior를 시행하고자 하는 경우, Runtime Error가 발생한다. G++ 코드를 실행했을 때 Undefined Behavior가 발생하는 경우는 다음과 같다:
입력이 "2 16 5"일 때, 다음과 같은 G++ 코드를 실행시킬 경우, 4번 메모리에 쓰인 값은 5다.
INPUT 2
NOT 2 3
NOT 3 2
INPUT 0
INPUT 0
XOR 3 0 1 2 1
OR 3 3 1 2 4
이제 여러분은 다음 문제를 G++로 풀어야 한다:
가로 W칸, 세로 H칸인 크기 H×W의 이차원 격자판이 있다. 격자판의 가장 왼쪽 윗칸의 좌표는 (0,0), 가장 오른쪽 아랫칸의 좌표는 (H−1,W−1)다. 좌표 (i,j)인 칸에는 수 A_i×W+j가 적혀있다.
격자판에서 왼쪽 위의 좌표가 (a,b), 오른쪽 아래의 좌표가 (c,d)인 직사각형을 생각하자. 이 직사각형에 포함된 칸에 적힌 수의 합을 S라 하자.
여러분은 다음과 같은 입력에 대하여, 실행 후 0번 메모리에 쓰인 값이 S고 이를 제외한 나머지 메모리에 쓰인 값이 전부 0이 되도록 하는 G++ 코드를 작성하여야 한다.
G++ 프로그램에 제공되는 입력은 다음과 같다:
H W A_0 A_1 … A_H×W−1 a b c d
여러분에게는 오직 두 정수 H, W가 주어진다. 즉, 여러분이 제출하는 코드는 H와 W의 값만 읽어들일 수 있다. A_0, …, A_H×W−1, a, b, c, d의 값은 제공되지 않음에 유의하라.
실행 후, 0번 메모리에는 S가 적혀있고, 이를 제외한 모든 메모리에는 0이 적혀있는 G++ 코드를 출력하라.
모든 데이터는 다음 조건을 만족한다: