발전량 증감
문제
한 태양광 발전소의 패널이 N × M 크기의 격자 모양으로 깔려 있다. 1행 1열부터 N행 M열까지의 각 구획에는, 이번 달 발전량이 지난 달에 비하여 얼마나 바뀌었는지가 정수로 적혀 있다. 값이 양수면 그만큼 늘어난 것이고, 음수면 그만큼 줄어든 것이다.
발전소 관리자는 격자의 일부만 떼어 보고 그 구역의 증감을 합쳐 보려고 한다. 구체적으로 K번의 조회를 하는데, 각 조회는 네 개의 수 i, j, x, y로 이루어진다. 이는 i행 j열을 왼쪽 위 모퉁이로 하고 x행 y열을 오른쪽 아래 모퉁이로 하는 직사각형 구역에 속한 모든 구획의 값을 더하는 작업을 의미한다.
격자에 적힌 증감 값과 K번의 조회 정보가 주어졌을 때, 각 조회의 결과를 차례대로 계산하는 프로그램을 작성하여라.
예를 들어 N=2, M=3인 격자에 적힌 값이 다음의 표와 같다고 해보자.
| 행 | 1열 | 2열 | 3열 |
|---|---|---|---|
| 1행 | 1 | 2 | 4 |
| 2행 | 8 | 16 | 32 |
이후에 K=3번의 조회에 대한 정보가 차례대로 [1, 1, 2, 3], [1, 2, 1, 2], [1, 3, 2, 3]이라고 가정하자. 각 조회의 결과를 표로 정리하면 다음과 같다.
| 조회 | 1번 | 2번 | 3번 |
|---|---|---|---|
| 왼쪽 위 모퉁이 | 1행 1열 | 1행 2열 | 1행 3열 |
| 오른쪽 아래 모퉁이 | 2행 3열 | 1행 2열 | 2행 3열 |
| 더한 값 | 1과 2와 4와 8과 16과 32 | 2 | 4와 32 |
| 결과 | 63 | 2 | 36 |
조회가 최대 1만 번이므로, 조회마다 직사각형 안의 값을 하나씩 다시 더하면 시간이 모자란다. 1행 1열을 왼쪽 위 모퉁이로 하는 직사각형의 합을 모든 칸에 대하여 미리 적어 두면, 조회 한 번을 덧셈과 뺄셈 몇 번으로 끝낼 수 있다. 위 예시에서 미리 적어 둔 값을 표로 정리하면 다음과 같다.
| 행 | 1열 | 2열 | 3열 |
|---|---|---|---|
| 1행 | 1 | 3 | 7 |
| 2행 | 9 | 27 | 63 |
따라서 이 경우의 정답은 차례대로 63, 2, 36이다.
입출력 예시
예시 1
입력
2 3 1 2 4 8 16 32 3 1 1 2 3 1 2 1 2 1 3 2 3
출력
63 2 36
예시 2
입력
2 2 1349 970 2754 -519 2 1 2 1 2 2 2 2 2
출력
970 -519
예시 3
입력
1 1 6042 1 1 1 1 1
출력
6042
입력 조건
가장 먼저 첫째 줄에 격자의 행의 수 N과 열의 수 M이 공백으로 구분되어 주어진다. N과 M은 각각 1 이상 300 이하의 자연수다.
이어서 N개의 줄에 걸쳐 격자에 적힌 값이 주어진다. 각 줄에는 M개의 수가 공백으로 구분되어 주어지며, 각 값은 절댓값이 10,000 이하인 정수다.
이어서 다음 줄에 조회의 횟수 K가 주어진다. K는 1 이상 10,000 이하의 자연수다.
이어서 K개의 줄에 걸쳐 각 조회의 정보가 주어진다. 각 줄에는 네 개의 수 i, j, x, y가 공백으로 구분되어 주어진다. i는 1 이상 N 이하의 자연수이고 x는 i 이상 N 이하의 자연수다. j는 1 이상 M 이하의 자연수이고 y는 j 이상 M 이하의 자연수다.
입력 전체의 크기는 최대 약 0.6MB다. 줄의 수가 최대 10,302개이므로, 입력 전체를 한 번에 읽어서 줄 단위로 나누는 방식으로 처리해야 한다.
출력 조건
K번의 조회 결과를 한 줄에 하나씩 차례대로 출력한다. 마지막 결과 뒤에는 줄바꿈 하나만 붙으며, 빈 줄을 더 붙이지 않는다.
요구사항
- 조회는 항상 i가 x보다 작거나 같고, j가 y보다 작거나 같은 형태로 주어집니다
- 왼쪽 위 모퉁이와 오른쪽 아래 모퉁이가 같은 칸이면 그 칸의 값 하나만 더합니다
- 격자에 적힌 값은 음수일 수 있고, 구역의 합도 음수일 수 있습니다
- 조회가 최대 1만 번이므로 조회마다 직사각형을 다시 더하면 시간이 모자랍니다
- 출력의 끝에 빈 줄을 더 붙이지 않습니다
- 표준 입력으로 읽고 표준 출력으로 내보내는 프로그램을 짜야 합니다
- 쓸 수 있는 말은 파이썬, 자바스크립트입니다
- 메모리 제한은 256MB입니다. 브라우저에서는 재지 않고 적기만 합니다
- 시간 제한은 출제자의 정답 코드를 같은 런타임에서 재서 정합니다
- 이 문제는 프롬프트가 아니라 코드를 냅니다. 그 코드는 이 기기의 브라우저에서 돌고, 서버로는 나온 출력의 지문과 걸린 시간만 갑니다. 맞았는지는 서버가 정합니다. 실행 시간은 각자 기기가 적어 보내는 값이라, 코드와 기기 정보를 순위표에 같이 내걸어 둡니다.
- 출력이 글자 하나까지 기대값과 같아야 합니다. 줄 안의 빈칸은 다른 글자와 똑같이 봅니다.
- 케이스는 15개이고, 그 가운데 3개는 입력과 기대 출력을 함께 보여 줍니다. 나머지는 제출할 때만 쓰이고 화면에는 보여 주지 않습니다.
- 케이스 15개를 전부 통과해야 해결입니다.
예시
공개 케이스 3개입니다. 채점에는 숨은 케이스가 함께 쓰입니다. 케이스 15개를 전부 통과해야 해결입니다.
1 1 6042 1 1 1 1 1
6042
2 2 1349 970 2754 -519 2 1 2 1 2 2 2 2 2
970 -519
2 3 1 2 4 8 16 32 3 1 1 2 3 1 2 1 2 1 3 2 3
63 2 36
풀이
코드는 이 기기에서돕니다. 서버로는 나온 출력의 지문과 걸린 시간만 갑니다. 맞았는지는 서버가 정합니다.
제출은 로그인 하셔야 됩니다. 공개 케이스로 돌려보는 것은 로그인 없이도 됩니다.
공개 케이스 3개로 돌려보기가 됩니다. 제출하면 숨은 케이스까지 돕니다.
이 문제를 푼 사람
아직 없습니다. 첫 번째가 되실 수 있습니다.