/**
____ ____ ____ ____ ____
||a |||t |||o |||d |||o ||
||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|
**/
#include <bits/stdc++.h>
#pragma GCC optimize ("O3,Ofast,fast-math,unroll-loops")
#pragma GCC target ("avx2,tune=native")
using namespace std;
typedef long long ll;
const int N_MAX = 2500000;
const int BUFFER_SIZE = 40000;
char buffer[BUFFER_SIZE];
int bpos = BUFFER_SIZE - 1;
char read_char ()
{
bpos++;
if(bpos == BUFFER_SIZE)
{
fread(buffer, sizeof(char), BUFFER_SIZE, stdin);
bpos = 0;
}
return buffer[bpos];
}
bool isDigit[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int read_int ()
{
int ans = 0;
char c;
while(isDigit[c = read_char()])
{
ans = ans * 10 + c - '0';
}
return ans;
}
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);
N = read_int();
M = read_int();
mat = vector <vector <ll>> (N + 2, vector <ll> (M + 2, 0));
UL = mat;
UR = mat;
DL = mat;
DR = mat;
int K;
K = read_int();
while (K--) {
int x, y, a, b;
x = read_int();
y = read_int();
a = read_int();
b = read_int();
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 = read_int();
while (Q--) {
int x1, y1, x2, y2;
x1 = read_int();
y1 = read_int();
x2 = read_int();
y2 = read_int();
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;
}
Compilation message
nuclearia.cpp: In function 'int read_int()':
nuclearia.cpp:58:21: warning: array subscript has type 'char' [-Wchar-subscripts]
58 | while(isDigit[c = read_char()])
| ~~^~~~~~~~~~~~~
nuclearia.cpp: In function 'char read_char()':
nuclearia.cpp:30:14: warning: ignoring return value of 'size_t fread(void*, size_t, size_t, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
30 | fread(buffer, sizeof(char), BUFFER_SIZE, stdin);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
763 ms |
724416 KB |
Output is correct |
2 |
Correct |
26 ms |
2772 KB |
Output is correct |
3 |
Correct |
22 ms |
2336 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
790 ms |
724380 KB |
Output is correct |
2 |
Correct |
24 ms |
2772 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
61 ms |
99648 KB |
Output is correct |
2 |
Correct |
25 ms |
2772 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
64 ms |
109904 KB |
Output is correct |
2 |
Correct |
25 ms |
2736 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
851 ms |
726652 KB |
Output is correct |
2 |
Correct |
30 ms |
3276 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
402 ms |
292336 KB |
Output is correct |
2 |
Correct |
25 ms |
2800 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
120 ms |
101144 KB |
Output is correct |
2 |
Correct |
27 ms |
3016 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
253 ms |
186728 KB |
Output is correct |
2 |
Correct |
25 ms |
2780 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
1022 ms |
726824 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
1036 ms |
726868 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
197 ms |
101720 KB |
Output is correct |
2 |
Correct |
191 ms |
100844 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
192 ms |
101224 KB |
Output is correct |
2 |
Correct |
175 ms |
100772 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
167 ms |
103052 KB |
Output is correct |
2 |
Correct |
203 ms |
103472 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
177 ms |
102168 KB |
Output is correct |
2 |
Correct |
296 ms |
335392 KB |
Output is correct |