Problem p03217 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i < b; i++)
#define rrep(i, a, b) for (int i = a; i >= b; i--)
#define fore(i, a) for (auto &i : a)
#define all(x) (x).begin(), (x).end()
#pragma GCC optimize("-O3")
using namespace std;
void _main();
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  _main();
}
typedef long long ll;
const int inf = INT_MAX / 2;
const ll infl = 1LL << 60;
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
//---------------------------------------------------------------------------------------------------
template <typename T, int VW, int VH> struct Ruisekiwa2D {
  T v[VH][VW];
  Ruisekiwa2D() { rep(y, 0, VH) rep(x, 0, VW) v[y][x] = 0; }
  void set(int x, int y, T c) { v[y][x] = c; }
  void build() {
    rep(y, 0, VH) rep(x, 0, VW) {
      if (0 < y)
        v[y][x] += v[y - 1][x];
      if (0 < x)
        v[y][x] += v[y][x - 1];
      if (0 < y && 0 < x)
        v[y][x] -= v[y - 1][x - 1];
    }
  }
  T get(int sx, int sy, int tx, int ty) {
    assert(sx <= tx && sy <= ty);
    T rs = v[ty][tx];
    if (0 < sx)
      rs -= v[ty][sx - 1];
    if (0 < sy)
      rs -= v[sy - 1][tx];
    if (0 < sx && 0 < sy)
      rs += v[sy - 1][sx - 1];
    return rs;
  }
};
/*---------------------------------------------------------------------------------------------------
　　　　　　　　　　　 ∧＿∧
　　　　　 ∧＿∧ 　（´<_｀ ）　 Welcome to My Coding Space!
　　　　 （ ´_ゝ`）　/　 ⌒i
　　　　／　　　＼　 　  |　|
　　　 /　　 /￣￣￣￣/　　|
　 ＿_(__ﾆつ/　    ＿/ .| .|＿＿＿＿
　 　　　＼/＿＿＿＿/　（u　⊃
---------------------------------------------------------------------------------------------------*/

int N, D, X[101010], Y[101010];
//---------------------------------------------------------------------------------------------------
int cnt[1010][1010];
int check(int r) {
  Ruisekiwa2D<int, 2010, 2010> aa, ab, bb;

  int a = r / D;
  int b = r % D;

  rep(y, 0, D * 2) rep(x, 0, D * 2) {
    int xx = x % D, yy = y % D;
    if (1LL * a * a < cnt[yy][xx]) {
      aa.set(x, y, 1);
    }
    if (1LL * a * (a + 1) < cnt[yy][xx]) {
      ab.set(x, y, 1);
    }
    if (1LL * (a + 1) * (a + 1) < cnt[yy][xx]) {
      bb.set(x, y, 1);
    }
  }
  aa.build();
  ab.build();
  bb.build();

  rep(sy, 0, D) rep(sx, 0, D) {
    int ok = 1;
    if (0 < b) {
      if (bb.get(sx, sy, sx + b - 1, sy + b - 1))
        ok = 0;
      if (ab.get(sx, sy + b, sx + b - 1, sx + D - 1))
        ok = 0;
      if (ab.get(sx + b, sy, sx + D - 1, sy + b - 1))
        ok = 0;
    }

    if (aa.get(sx + b, sy + b, sx + D - 1, sy + D - 1))
      ok = 0;
    if (ok)
      return 1;
  }

  return 0;
}
//---------------------------------------------------------------------------------------------------
void _main() {
  cin >> N >> D;
  rep(i, 0, N) cin >> X[i] >> Y[i];
  rep(i, 0, N) cnt[Y[i] % D][X[i] % D]++;

  check(2);

  int ng = 1, ok = inf;
  while (ng + 1 != ok) {
    int md = (ng + ok) / 2;
    if (check(md))
      ok = md;
    else
      ng = md;
  }
  cout << ok - 1 << endl;
}


Fixed submission:
#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i < b; i++)
#define rrep(i, a, b) for (int i = a; i >= b; i--)
#define fore(i, a) for (auto &i : a)
#define all(x) (x).begin(), (x).end()
#pragma GCC optimize("-O3")
using namespace std;
void _main();
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  _main();
}
typedef long long ll;
const int inf = INT_MAX / 2;
const ll infl = 1LL << 60;
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
//---------------------------------------------------------------------------------------------------
template <typename T, int VW, int VH> struct Ruisekiwa2D {
  T v[VH][VW];
  Ruisekiwa2D() { rep(y, 0, VH) rep(x, 0, VW) v[y][x] = 0; }
  void set(int x, int y, T c) { v[y][x] = c; }
  void build() {
    rep(y, 0, VH) rep(x, 0, VW) {
      if (0 < y)
        v[y][x] += v[y - 1][x];
      if (0 < x)
        v[y][x] += v[y][x - 1];
      if (0 < y && 0 < x)
        v[y][x] -= v[y - 1][x - 1];
    }
  }
  T get(int sx, int sy, int tx, int ty) {
    assert(sx <= tx && sy <= ty);
    T rs = v[ty][tx];
    if (0 < sx)
      rs -= v[ty][sx - 1];
    if (0 < sy)
      rs -= v[sy - 1][tx];
    if (0 < sx && 0 < sy)
      rs += v[sy - 1][sx - 1];
    return rs;
  }
};
/*---------------------------------------------------------------------------------------------------
　　　　　　　　　　　 ∧＿∧
　　　　　 ∧＿∧ 　（´<_｀ ）　 Welcome to My Coding Space!
　　　　 （ ´_ゝ`）　/　 ⌒i
　　　　／　　　＼　 　  |　|
　　　 /　　 /￣￣￣￣/　　|
　 ＿_(__ﾆつ/　    ＿/ .| .|＿＿＿＿
　 　　　＼/＿＿＿＿/　（u　⊃
---------------------------------------------------------------------------------------------------*/

int N, D, X[101010], Y[101010];
//---------------------------------------------------------------------------------------------------
int cnt[1010][1010];
int check(int r) {
  Ruisekiwa2D<int, 2010, 2010> aa, ab, bb;

  int a = r / D;
  int b = r % D;

  rep(y, 0, D * 2) rep(x, 0, D * 2) {
    int xx = x % D, yy = y % D;
    if (1LL * a * a < cnt[yy][xx]) {
      aa.set(x, y, 1);
    }
    if (1LL * a * (a + 1) < cnt[yy][xx]) {
      ab.set(x, y, 1);
    }
    if (1LL * (a + 1) * (a + 1) < cnt[yy][xx]) {
      bb.set(x, y, 1);
    }
  }
  aa.build();
  ab.build();
  bb.build();

  rep(sy, 0, D) rep(sx, 0, D) {
    int ok = 1;
    if (0 < b) {
      if (bb.get(sx, sy, sx + b - 1, sy + b - 1))
        ok = 0;
      if (ab.get(sx, sy + b, sx + b - 1, sy + D - 1))
        ok = 0;
      if (ab.get(sx + b, sy, sx + D - 1, sy + b - 1))
        ok = 0;
    }

    if (aa.get(sx + b, sy + b, sx + D - 1, sy + D - 1))
      ok = 0;
    if (ok)
      return 1;
  }

  return 0;
}
//---------------------------------------------------------------------------------------------------
void _main() {
  cin >> N >> D;
  rep(i, 0, N) cin >> X[i] >> Y[i];
  rep(i, 0, N) cnt[Y[i] % D][X[i] % D]++;

  check(2);

  int ng = 1, ok = inf;
  while (ng + 1 != ok) {
    int md = (ng + ok) / 2;
    if (check(md))
      ok = md;
    else
      ng = md;
  }
  cout << ok - 1 << endl;
}