/**
____ ____ ____ ____ ____
||a |||t |||o |||d |||o ||
||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|
**/
#include <bits/stdc++.h>
#pragma GCC optimize ("O3,Ofast,fast-math,unroll-loops")
#pragma GCC target ("tune=native")
using namespace std;
typedef long long ll;
const int N_MAX = 2500000;
vector <vector <ll>> mat;
vector <vector <ll>> UL;
vector <vector <ll>> UR;
vector <vector <ll>> DL;
vector <vector <ll>> DR;
ll U[N_MAX + 2];
ll D[N_MAX + 2];
ll L[N_MAX + 2];
ll R[N_MAX + 2];
int N, M;
void addUL (int x, int y, int len, int val) {
mat[1][1] += (ll) val * max(0, len - max(x, y));
DR[x][y] += val;
if (x - len + 1 >= 1 && y - len + 1 >= 1) {
DR[x - len][y - len] -= val;
} else {
int mn = min(x, y) - 1;
x -= mn; y -= mn;
DR[x - 1][y - 1] -= val;
len -= mn;
if (y == 1) {
D[x - 1] += val;
if (x - len >= 1) {
D[x - len] -= val;
}
} else if (x == 1) {
R[y - 1] += val;
if (y - len >= 1) {
R[y - len] -= val;
}
}
}
}
void addUR (int x, int y, int len, int val) {
DL[x][y] += val;
if (x - len + 1 >= 1 && y + len - 1 <= M) {
DL[x - len][y + len] -= val;
} else {
int mn = min(x, M - y + 1) - 1;
x -= mn; y += mn;
DL[x - 1][y + 1] -= val;
len -= mn;
if (x == 1) {
L[y + 1] += val;
if (y + len <= M) {
L[y + len] -= val;
}
}
}
}
void addDL (int x, int y, int len, int val) {
UR[x][y] += val;
if (x + len - 1 <= N && y - len + 1 >= 1) {
UR[x + len][y - len] -= val;
} else {
int mn = min(N - x + 1, y) - 1;
x += mn; y -= mn;
UR[x + 1][y - 1] -= val;
len -= mn;
if (y == 1) {
U[x + 1] += val;
if (x + len <= N) {
U[x + len] -= val;
}
}
}
}
void addDR (int x, int y, int len, int val) {
UL[x][y] += val;
if (x + len <= N && y + len <= M) {
UL[x + len][y + len] -= val;
}
}
void add (int x, int y, int len, int val) {
int x1 = x - len + 1, y1 = y - len + 1;
int x2 = x + len - 1, y2 = y + len - 1;
x1 = max(1, x1); y1 = max(1, y1);
x2 = min(N, x2); y2 = min(M, y2);
mat[x1][y1] += val;
mat[x1][y2 + 1] -= val;
mat[x2 + 1][y1] -= val;
mat[x2 + 1][y2 + 1] += val;
}
int main () {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> N >> M;
mat = vector <vector <ll>> (N + 2, vector <ll> (M + 2, 0));
UL = mat;
UR = mat;
DL = mat;
DR = mat;
int K;
cin >> K;
while (K--) {
int x, y, a, b;
cin >> x >> y >> a >> b;
int len = a / b;
addUL(x, y, len, +b);
addUR(x, y + 1, len, -b);
addDL(x + 1, y, len, -b);
addDR(x + 1, y + 1, len, +b);
add(x, y, len + 1, a % b);
}
for (int i = 1; i <= N; i++) {
U[i] += U[i - 1];
mat[i][1] += U[i];
}
for (int i = N; i >= 1; i--) {
D[i] += D[i + 1];
mat[i][1] += D[i];
}
for (int j = 1; j <= M; j++) {
L[j] += L[j - 1];
mat[1][j] += L[j];
}
for (int j = M; j >= 1; j--) {
R[j] += R[j + 1];
mat[1][j] += R[j];
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
UL[i][j] += UL[i - 1][j - 1];
UR[i][j] += UR[i - 1][j + 1];
}
}
for (int i = N; i >= 1; i--) {
for (int j = M; j >= 1; j--) {
DL[i][j] += DL[i + 1][j - 1];
DR[i][j] += DR[i + 1][j + 1];
}
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
mat[i][j] += UL[i][j];
mat[i][j] += UR[i][j];
mat[i][j] += DL[i][j];
mat[i][j] += DR[i][j];
mat[i][j] += mat[i - 1][j] + mat[i][j - 1] - mat[i - 1][j - 1];
}
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= M; j++) {
mat[i][j] += mat[i - 1][j] + mat[i][j - 1] - mat[i - 1][j - 1];
}
}
int Q;
cin >> Q;
while (Q--) {
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
ll sum = mat[x2][y2] - mat[x1 - 1][y2] - mat[x2][y1 - 1] + mat[x1 - 1][y1 - 1];
ll area = (ll) (x2 - x1 + 1) * (y2 - y1 + 1);
ll answer = sum / area;
if (sum % area >= (area + 1) / 2 && area != 1) {
answer++;
}
cout << answer << "\n";
}
return 0;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
783 ms |
724408 KB |
Output is correct |
2 |
Correct |
59 ms |
2736 KB |
Output is correct |
3 |
Correct |
57 ms |
2404 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
768 ms |
724408 KB |
Output is correct |
2 |
Correct |
61 ms |
2764 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
60 ms |
99600 KB |
Output is correct |
2 |
Correct |
58 ms |
2732 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
65 ms |
110040 KB |
Output is correct |
2 |
Correct |
61 ms |
2736 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
911 ms |
726560 KB |
Output is correct |
2 |
Correct |
65 ms |
3148 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
427 ms |
292400 KB |
Output is correct |
2 |
Correct |
61 ms |
2824 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
165 ms |
101140 KB |
Output is correct |
2 |
Correct |
68 ms |
2912 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
288 ms |
186608 KB |
Output is correct |
2 |
Correct |
55 ms |
2704 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
1126 ms |
726808 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
1079 ms |
726760 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
323 ms |
101596 KB |
Output is correct |
2 |
Correct |
312 ms |
100952 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
281 ms |
101092 KB |
Output is correct |
2 |
Correct |
273 ms |
100968 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
241 ms |
102956 KB |
Output is correct |
2 |
Correct |
268 ms |
103556 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
295 ms |
102032 KB |
Output is correct |
2 |
Correct |
379 ms |
335572 KB |
Output is correct |