Pythonmain.py · 19 行import sys data = sys.stdin.buffer.read().split()r, c, q = int(data[0]), int(data[1]), int(data[2])pos = 3 # P[i][j] = 왼쪽 위 (1,1)부터 (i,j)까지 직사각형의 합. 0번째 줄·칸은 0으로 둔다P = [[0] * (c + 1) for _ in range(r + 1)]for i in range(1, r + 1): for j in range(1, c + 1): P[i][j] = int(data[pos]) + P[i - 1][j] + P[i][j - 1] - P[i - 1][j - 1] pos += 1 out = []for _ in range(q): r1, c1, r2, c2 = map(int, data[pos:pos + 4]) pos += 4 out.append(P[r2][c2] - P[r1 - 1][c2] - P[r2][c1 - 1] + P[r1 - 1][c1 - 1])print("\n".join(map(str, out)))
JavaScriptmain.js · 19 行const t = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const [r, c, q] = t;let pos = 3; // P[i][j] = 왼쪽 위 (1,1)부터 (i,j)까지 직사각형의 합. 0번째 줄·칸은 0으로 둔다const P = Array.from({ length: r + 1 }, () => new Array(c + 1).fill(0));for (let i = 1; i <= r; i++) { for (let j = 1; j <= c; j++) { P[i][j] = t[pos++] + P[i - 1][j] + P[i][j - 1] - P[i - 1][j - 1]; }} const out = [];for (let k = 0; k < q; k++) { const [r1, c1, r2, c2] = t.slice(pos, pos + 4); pos += 4; out.push(P[r2][c2] - P[r1 - 1][c2] - P[r2][c1 - 1] + P[r1 - 1][c1 - 1]);}console.log(out.join("\n"));
TypeScriptmain.ts · 20 行import { readFileSync } from "node:fs";const t: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);const [r, c, q] = t;let pos = 3; // P[i][j] = 왼쪽 위 (1,1)부터 (i,j)까지 직사각형의 합. 0번째 줄·칸은 0으로 둔다const P: number[][] = Array.from({ length: r + 1 }, () => new Array(c + 1).fill(0));for (let i = 1; i <= r; i++) { for (let j = 1; j <= c; j++) { P[i][j] = t[pos++] + P[i - 1][j] + P[i][j - 1] - P[i - 1][j - 1]; }} const out: number[] = [];for (let k = 0; k < q; k++) { const [r1, c1, r2, c2] = t.slice(pos, pos + 4); pos += 4; out.push(P[r2][c2] - P[r1 - 1][c2] - P[r2][c1 - 1] + P[r1 - 1][c1 - 1]);}console.log(out.join("\n"));
JavaMain.java · 30 行import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int r = Integer.parseInt(st.nextToken()), c = Integer.parseInt(st.nextToken()), q = Integer.parseInt(st.nextToken()); // P[i][j] = 왼쪽 위 (1,1)부터 (i,j)까지 직사각형의 합. 0번째 줄·칸은 0(자바 배열은 0으로 채워진다) long[][] P = new long[r + 1][c + 1]; for (int i = 1; i <= r; i++) { st = new StringTokenizer(br.readLine()); for (int j = 1; j <= c; j++) { P[i][j] = Long.parseLong(st.nextToken()) + P[i - 1][j] + P[i][j - 1] - P[i - 1][j - 1]; } } StringBuilder out = new StringBuilder(); for (int k = 0; k < q; k++) { st = new StringTokenizer(br.readLine()); int r1 = Integer.parseInt(st.nextToken()), c1 = Integer.parseInt(st.nextToken()); int r2 = Integer.parseInt(st.nextToken()), c2 = Integer.parseInt(st.nextToken()); out.append(P[r2][c2] - P[r1 - 1][c2] - P[r2][c1 - 1] + P[r1 - 1][c1 - 1]).append('\n'); } System.out.print(out); }}
C#Main.cs · 26 行using System;using System.Text; class Program{ static void Main() { string[] t = Console.In.ReadToEnd().Split((char[])null, StringSplitOptions.RemoveEmptyEntries); int r = int.Parse(t[0]), c = int.Parse(t[1]), q = int.Parse(t[2]); int pos = 3; // P[i, j] = 왼쪽 위 (1,1)부터 (i,j)까지 직사각형의 합. 0번째 줄·칸은 0 long[,] P = new long[r + 1, c + 1]; for (int i = 1; i <= r; i++) for (int j = 1; j <= c; j++) P[i, j] = long.Parse(t[pos++]) + P[i - 1, j] + P[i, j - 1] - P[i - 1, j - 1]; var sb = new StringBuilder(); for (int k = 0; k < q; k++, pos += 4) { int r1 = int.Parse(t[pos]), c1 = int.Parse(t[pos + 1]), r2 = int.Parse(t[pos + 2]), c2 = int.Parse(t[pos + 3]); sb.Append(P[r2, c2] - P[r1 - 1, c2] - P[r2, c1 - 1] + P[r1 - 1, c1 - 1]).Append('\n'); } Console.Write(sb); }}
C++main.cpp · 24 行#include <iostream>#include <vector> int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int r, c, q; std::cin >> r >> c >> q; // P[i][j] = 왼쪽 위 (1,1)부터 (i,j)까지 직사각형의 합. 0번째 줄·칸은 0으로 둔다 std::vector<std::vector<long long>> P(r + 1, std::vector<long long>(c + 1, 0)); for (int i = 1; i <= r; i++) { for (int j = 1; j <= c; j++) { long long v; std::cin >> v; P[i][j] = v + P[i - 1][j] + P[i][j - 1] - P[i - 1][j - 1]; } } for (int k = 0; k < q; k++) { int r1, c1, r2, c2; std::cin >> r1 >> c1 >> r2 >> c2; std::cout << P[r2][c2] - P[r1 - 1][c2] - P[r2][c1 - 1] + P[r1 - 1][c1 - 1] << '\n'; }}
Cmain.c · 24 行#include <stdio.h> #define MAX 100 /* P[i][j] = 왼쪽 위 (1,1)부터 (i,j)까지 직사각형의 합. 0번째 줄·칸은 0(전역 배열은 0으로 시작) */static long long P[MAX + 1][MAX + 1]; int main(void) { int r, c, q; scanf("%d %d %d", &r, &c, &q); for (int i = 1; i <= r; i++) { for (int j = 1; j <= c; j++) { long long v; scanf("%lld", &v); P[i][j] = v + P[i - 1][j] + P[i][j - 1] - P[i - 1][j - 1]; } } for (int k = 0; k < q; k++) { int r1, c1, r2, c2; scanf("%d %d %d %d", &r1, &c1, &r2, &c2); printf("%lld\n", P[r2][c2] - P[r1 - 1][c2] - P[r2][c1 - 1] + P[r1 - 1][c1 - 1]); } return 0;}
Craykonmain.cray · 29 行첫줄 = コンソール.数読み();r = 첫줄[0];c = 첫줄[1];q = 첫줄[2]; // P[i][j] = 왼쪽 위 (1,1)부터 (i,j)까지 직사각형의 합. 0번째 줄·칸은 0으로 둔다P = [];繰り返す (i = 0; i <= r; i++){ P.追加(新リスト(c + 1, 0));}繰り返す (i = 1; i <= r; i++){ row = コンソール.数読み(); 繰り返す (j = 1; j <= c; j++) { P[i][j] = row[j - 1] + P[i - 1][j] + P[i][j - 1] - P[i - 1][j - 1]; }} 繰り返す (k = 0; k < q; k++){ qq = コンソール.数読み(); r1 = qq[0]; c1 = qq[1]; r2 = qq[2]; c2 = qq[3]; コンソール.書く(P[r2][c2] - P[r1 - 1][c2] - P[r2][c1 - 1] + P[r1 - 1][c1 - 1]);}