Submission #1230543

#TimeUsernameProblemLanguageResultExecution timeMemory
1230543kaiboyNuclearia (CEOI15_nuclearia)C++20
100 / 100
496 ms316216 KiB
// coached by rainboy
#include <algorithm>
#include <iostream>

using namespace std;

const int N = 2500000;

long long *dd0[N], *dd1[N], ee0[N], ee1[N], *dd[N];

int main() {
	ios_base::sync_with_stdio(false), cin.tie(NULL);
	int n, m, k; cin >> n >> m >> k;
	for (int i = 0; i < n; i++) {
		dd0[i] = new long long[m];
		dd1[i] = new long long[m];
		dd[i] = new long long[m];
	}
	while (k--) {
		int i, j, a, b; cin >> i >> j >> a >> b, i--, j--;
		int k = a / b, r = a % b, il = max(i - k, 0), jl = max(j - k, 0);
		if (k) {
			int l = min(k, min(n - 1 - i, m - 1 - j));
			dd0[i + l][j + l] += b, dd0[il][jl] -= b;
			dd[0][0] += (long long) b * max(k - max(i, j), 0);
			if (i - (k - 1) >= 0 && j + k < m)
				dd1[i - (k - 1)][j + k] -= b;
			else if (j + i + 2 < m) {
				dd1[0][j + i + 1] -= b, ee0[j + i + 2] -= b;
				if (j + k + 1 < m)
					ee0[j + k + 1] += b;
			} else if (i - (m - 1 - j - 1) < n)
				dd1[i - (m - 1 - j - 1)][m - 1] -= b;
			if (i + k + 1 < n && j - k >= 0)
				dd1[i + k + 1][j - k] += b;
			else if (i + j + 2 < n) {
				ee1[i + j + 2] -= b;
				if (i + k + 1 < n)
					ee1[i + k + 1] += b;
			}
		}
		dd[il][jl] += r;
		if (j + 1 + k < m)
			dd[il][j + 1 + k] -= r;
		if (i + 1 + k < n)
			dd[i + 1 + k][jl] -= r;
		if (i + 1 + k < n && j + 1 + k < m)
			dd[i + 1 + k][j + 1 + k] += r;
	}
	for (int i = n - 1; i >= 0; i--)
		for (int j = m - 1; j >= 0; j--)
			if (i || j)
				dd0[max(i - 1, 0)][max(j - 1, 0)] += dd0[i][j];
	for (int i = 1; i < n; i++)
		for (int j = m - 2; j >= 0; j--)
			dd1[i][j] += dd1[i - 1][j + 1];
	for (int j = 1; j < m; j++)
		ee0[j] += ee0[j - 1];
	for (int j = 0; j < m; j++)
		dd[0][j] += ee0[j];
	for (int i = 1; i < n; i++)
		ee1[i] += ee1[i - 1];
	for (int i = 0; i < n; i++)
		dd[i][0] += ee1[i];
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			dd[i][j] += dd0[i][j] + dd1[i][j];
	for (int i = 0; i < n; i++)
		for (int j = 1; j < m; j++)
			dd[i][j] += dd[i][j - 1];
	for (int i = 1; i < n; i++)
		for (int j = 0; j < m; j++)
			dd[i][j] += dd[i - 1][j];
	for (int i = 0; i < n; i++)
		for (int j = 1; j < m; j++)
			dd[i][j] += dd[i][j - 1];
	for (int i = 1; i < n; i++)
		for (int j = 0; j < m; j++)
			dd[i][j] += dd[i - 1][j];
	int t; cin >> t;
	while (t--) {
		int il, jl, ir, jr; cin >> il >> jl >> ir >> jr, il--, jl--, ir--, jr--;
		long long s = dd[ir][jr];
		if (il)
			s -= dd[il - 1][jr];
		if (jl)
			s -= dd[ir][jl - 1];
		if (il && jl)
			s += dd[il - 1][jl - 1];
		long long k = (ir - il + 1) * (jr - jl + 1), q = s / k, r = s % k;
		if (r >= (k + 1) / 2)
			q++;
		cout << q << '\n';
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...