코딩테스트/백준

[실1] 11660 - 구간 합 구하기 5

ShovelingLife 2023. 10. 6. 17:43
#include <iostream>
#include <vector>

using namespace std;

#pragma region 입출력 속도향상

#define FAST_IO() \
{\
	ios::sync_with_stdio(false);\
	cin.tie(NULL); \
	cout.tie(NULL); \
}\

#pragma endregion

int main()
{
	FAST_IO();

	int n, m;
	cin >> n >> m;
	vector<vector<int>> v(n + 1, vector<int>(n + 1));

	// 입력
	for (int y = 1; y < v.size(); y++)
	{
		for (int x = 1; x < v[y].size(); x++)
			cin >> v[y][x];
	}
	// 구간합 구하기
	vector<vector<int>> d(n + 1, vector<int>(n + 1));

	for (int y = 1; y < v.size(); y++)
	{
		for (int x = 1; x < v[y].size(); x++)
			// 아래는 공식 현재 축 y x 기준 1만큼 왼쪽 세 방향
			d[y][x] = d[y - 1][x] + d[y][x - 1] - d[y - 1][x - 1] + v[y][x];
	}
	// 정답 도출
	while (m--)
	{
		int y1, x1, y2, x2;
		cin >> y1 >> x1 >> y2 >> x2 ;
		cout << d[y2][x2] - d[y2][x1 - 1] - d[y1 - 1][x2] + d[y1 - 1][x1 - 1] << '\n';
	}
	return 0;
}