//#define _GLIBCXX_DEBUG
#include <bits/stdc++.h>
#pragma GCC optimize ("O3,Ofast,fast-math,unroll-loops")
#pragma GCC target ("avx2,tune=native")
using namespace std;
#define all(x) begin(x), end(x)
#define sz(x) ((int)size(x))
#define trace(x) cout << #x << ": " << (x) << endl;
typedef long long ll;
const int N = 200001, M = 2500002;
int X[N], Y[N], A[N], B[N], n, m, k;
ll** UL;
ll** UR;
ll** DL;
ll** DR;
ll** pref;
ll L[M], R[M], U[M], D[M];
void addDL (int x, int y, int len, ll 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, ll val) {
UL[x][y] += val;
if (x + len - 1 <= n && y + len - 1 <= m) {
UL[x + len][y + len] -= val;
}
};
void addUL (int x, int y, int len, ll val) {
pref[1][1] += 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, ll 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 addRect (int x1, int y1, int x2, int y2, ll val) {
x1 = max(x1, 1), y1 = max(y1, 1), y2 = min(y2, m), x2 = min(x2, n);
pref[x1][y1] += val;
pref[x2 + 1][y2 + 1] += val;
pref[x1][y2 + 1] -= val;
pref[x2 + 1][y1] -= val;
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m >> k;
for (int i = 1; i <= k; ++i) {
cin >> X[i] >> Y[i] >> A[i] >> B[i];
}
pref = new ll*[n + 2];
UL = new ll*[n + 2];
UR = new ll*[n + 2];
DL = new ll*[n + 2];
DR = new ll*[n + 2];
for (int i = 0; i <= n + 1; i++) {
pref[i] = new ll[m + 2];
UL[i] = new ll[m + 2];
UR[i] = new ll[m + 2];
DL[i] = new ll[m + 2];
DR[i] = new ll[m + 2];
for (int j = 0; j <= m + 1; j++) {
pref[i][j] = 0;
UL[i][j] = 0;
UR[i][j] = 0;
DL[i][j] = 0;
DR[i][j] = 0;
}
}
for (int i = 1; i <= k; ++i) {
int h = A[i] / B[i];
addRect(X[i] - h, Y[i] - h, X[i] + h, Y[i] + h, A[i] % B[i]);
addUR(X[i], Y[i] + 1, h, -B[i]);
addUL(X[i], Y[i], h, B[i]);
addDR(X[i] + 1, Y[i] + 1, h, B[i]);
addDL(X[i] + 1, Y[i], h, -B[i]);
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
UR[i][j] += UR[i - 1][j + 1];
UL[i][j] += UL[i - 1][j - 1];
}
}
for (int i = n; i >= 1; --i) {
for (int j = 1; j <= m; ++j) {
DL[i][j] += DL[i + 1][j - 1];
DR[i][j] += DR[i + 1][j + 1];
}
}
for (int i = 1; i <= m; ++i) {
L[i] += L[i - 1];
pref[1][i] += L[i];
}
for (int i = m; i >= 1; --i) {
R[i] += R[i + 1];
pref[1][i] += R[i];
}
for (int i = 1; i <= n; ++i) {
U[i] += U[i - 1];
pref[i][1] += U[i];
}
for (int i = n; i >= 1; --i) {
D[i] += D[i + 1];
pref[i][1] += D[i];
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
pref[i][j] += DR[i][j] + DL[i][j] + UR[i][j] + UL[i][j];
pref[i][j] = pref[i][j] + pref[i - 1][j] + pref[i][j - 1] - pref[i - 1][j - 1];
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
pref[i][j] = pref[i][j] + pref[i - 1][j] + pref[i][j - 1] - pref[i - 1][j - 1];
}
}
int q;
cin >> q;
for (int i = 1; i <= q; ++i) {
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
ll sum = pref[x2][y2] - pref[x1 - 1][y2] - pref[x2][y1 - 1] + pref[x1 - 1][y1 - 1];
ll S = (x2 - x1 + 1) * (ll) (y2 - y1 + 1);
cout << (sum * 2 / S + 1) / 2 << '\n';
}
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
672 ms |
528716 KB |
Output is correct |
2 |
Correct |
56 ms |
2764 KB |
Output is correct |
3 |
Correct |
72 ms |
2356 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
703 ms |
528724 KB |
Output is correct |
2 |
Correct |
58 ms |
2764 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
66 ms |
99292 KB |
Output is correct |
2 |
Correct |
66 ms |
2764 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
58 ms |
110284 KB |
Output is correct |
2 |
Correct |
57 ms |
2792 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
816 ms |
530932 KB |
Output is correct |
2 |
Correct |
57 ms |
3124 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
415 ms |
214140 KB |
Output is correct |
2 |
Correct |
57 ms |
2764 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
154 ms |
101168 KB |
Output is correct |
2 |
Correct |
67 ms |
2920 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
280 ms |
147584 KB |
Output is correct |
2 |
Correct |
54 ms |
2764 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
1031 ms |
534268 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
1029 ms |
534128 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
271 ms |
104424 KB |
Output is correct |
2 |
Correct |
245 ms |
103988 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
261 ms |
104024 KB |
Output is correct |
2 |
Correct |
291 ms |
103896 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
246 ms |
107928 KB |
Output is correct |
2 |
Correct |
268 ms |
105820 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
248 ms |
104712 KB |
Output is correct |
2 |
Correct |
360 ms |
338564 KB |
Output is correct |