#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> grid;
typedef long long int ll;
ll MOD = 1e9 + 7;
ll at_poll(ll x, ll y) {
y *= -1;
if (x == 0 && y == 0)
return 1;
ll loc = max(abs(x), abs(y));
ll slen = (2 * loc - 1);
ll val = slen * slen;
if (y == loc)
val += 6 * loc + loc + x;
else if (x == -loc)
val += 4 * loc + loc + y;
else if (y == -loc)
val += 2 * loc + loc - x;
else if (x == loc)
val += loc - y;
return val;
}
class ST {
int st_n;
vector<ll> val;
public:
ST(int n) : val(2 * n) { st_n = n; }
void update(int i, int v) {
i += st_n;
for (val[i] = (val[i] + v) % MOD; i > 1; i >>= 1)
val[i >> 1] = (val[i] + val[i ^ 1]) % MOD;
}
ll query(int l, int r) {
ll res = 0;
for (l += st_n, r += st_n; l < r; l >>= 1, r >>= 1) {
if (l & 1)
res += val[l++];
if (r & 1)
res += val[--r];
res %= MOD;
}
return res;
}
};
int main() {
int n, q;
cin >> n >> q;
vector<ll> ans(q);
vector<tuple<int, int, int, int, int>> queries;
ST pref(2 * n + 1);
for (int i = 0; i < q; i++) {
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
queries.push_back({y1 - 1, x1, x2, i, -1});
queries.push_back({y2, x1, x2, i, 1});
}
sort(queries.begin(), queries.end());
int query_idx = 0;
while (query_idx < queries.size() && get<0>(queries[query_idx]) < -n)
query_idx++;
for (int y = -n; y <= n; y++) {
for (int x = -n; x <= n; x++)
pref.update(n + x, at_poll(x, y));
while (query_idx < queries.size() && get<0>(queries[query_idx]) == y) {
auto [_y, x1, x2, idx, mul] = queries[query_idx];
ans[idx] += pref.query(n + x1, n + x2 + 1) * mul;
query_idx++;
}
}
for (int i = 0; i < q; i++)
cout << ans[i] % MOD << endl;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |