Submission #1263320

#TimeUsernameProblemLanguageResultExecution timeMemory
1263320rtriSpiral (BOI16_spiral)C++20
0 / 100
152 ms448 KiB
#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 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...